c# - C#:当不支持参数类型时,我应该抛出 ArgumentException 还是 NotSupportedException?
问题描述
所以,我遇到了需要抛出异常的情况,因为“不支持参数”。为了解释我是如何到达这里的,这是一个粗略的情况:
- Ooks 有多种类型,包括 Yooks 和 Zooks
- Ooks 可以与其他 Ooks 成为朋友,但仅限于正确的类型
- 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
(子类不接受论点),不是吗?
那么,我应该选择哪一个 - 或者我应该为这种情况编写一个自定义异常?
解决方案
你不应该抛出任何异常。你已经声明了这个方法:
public bool TryBefriend(Ook o0k)
它说这个方法需要一个 type 的参数Ook
。如果有人传递了一个属于该类型或其子类之一的参数,并且它可以编译,那么给他们一个运行时错误并说,实际上,“不,不是那种类型。我真的是这个意思类型和这种类型,但不是那种类型。”
如果可以尝试与某事成为朋友,但结果是它可能成功也可能不成功,那么尝试不应该抛出异常。我们不应该使用异常来管理正常的、可预测的程序流。
把它想象成试图从银行取钱。如果您尝试提取 1000 美元,您应该会收到一条消息说成功或失败,因为您没有 1000 美元。如果你有足够的钱,它不应该返回成功,如果你没有,它不应该抛出异常。没有足够的钱是正常的,可预测的可能性。另一方面,如果应用程序无法继续,因为它失去了数据库连接并且无法恢复,那么抛出异常是有意义的。
所以我只是返回true
or false
,然后调用者可以根据响应决定做什么。你会看到这个,这是有道理的:
if(someOok.TryBefriend(someOtherOook))
{
// friends!
}
else
{
// not friends!
}
...而不是这个,这很尴尬:
try
{
someOok.TryBefriend(someOtherOook);
// friends!
}
catch(NotSupportedException ex)
{
// not friends!
}
推荐阅读
- excel - VBA-Excel 文本到数字格式问题 - 用错误的值覆盖
- c++ - 容器在运行时调整大小的 Qt 错误
- excel - 是否有一个函数可以将 30 多个范围组合成一个(除了 union,因为我有太多范围)?
- python - 如何生成表格并由';'限制 txt 文件(或 csv),其中包含为 pandas 数据帧的每一列定义的字符数
- python - 动画不显示使用 matplotlib 传递的参数
- css - CSS 边框动画适用于 Chrome、Firefox,但不适用于 Edge 15/IE 11
- r - 如何使用 ggplot2 更改图表大小
- java - 合并 HDFS 中小于 128MB 的压缩 lzo 文件
- javascript - 编写 Firefox 插件以打开页面上的链接
- php - 在 PDO PHP 脚本中使用相同的 POST 值两次 | mysql