【发布时间】:2019-08-25 10:32:06
【问题描述】:
所以,我遇到了需要抛出异常的情况,因为“不支持参数”。为了解释我是如何到达这里的,这是粗略的情况:
- Ook 有多种类型,包括 Yook 和 Zooks
- Ook 可以与其他 Ook 成为朋友,但只能是正确的类型
- Yooks 可以与 Zooks 交朋友,但 Zooks 不能与 Yooks 交朋友
代码示例:
public abstract class Ook
{
public abstract bool TryBefriendYook(Yook yook);
public abstract bool TryBefriendZook(Zook zook);
public bool TryBefriend(Ook o0k)
{
Type ookType = ook.GetType;
if (ookType == typeof(Yook))
{
TryBefriendYook((Yook)ook);
return true;
}
else if (ookType == typeof(Zook))
{
TryBefriendZook((Zook)ook);
return true;
}
else return false;
}
public void Befriend(Ook ook)
{
if(!TryBefriend(ook))
throw new Exception(
"argument type not supported");
}
}
public sealed class Yook : Ook
{
public override bool TryBefriendYook(Yook yook)
{
return true;
}
public override bool TryBefriendZook(Zook zook)
{
return true;
}
}
public partial sealed class Zook : Ook
{
public override bool TryBefriendYook(Yook yook)
{
return false;
}
public override bool TryBefriendZook(Zook zook)
{
return true;
}
}
所以,这种类型属于ArgumentException(该参数不适用于子类)和NotSupportedException(子类不接受该参数),不是吗?
那么,我应该选择哪一个 - 或者我应该为这种情况编写一个自定义异常?
【问题讨论】:
-
NotSupportedException在不支持调用的方法时被抛出,msdn 描述了这些情况。ArgumentException或者你自己的更适合这里 -
您有什么理由要使用特定类型的异常吗?
-
@PavelAnikhouski 在这种情况下,
Zook.BefriendYook不受支持。这与 msdn 列出的第一个示例几乎完全相同。 @TheDon 你总是应该抛出最具体的异常,并且永远抛出普通的System.Exception。
标签: c# polymorphism custom-exceptions argumentexception notsupportedexception