在我的代码中,我经常遇到这样的情况:
public void MyMethod(string data)
{
AnotherClass objectOfAnotherClass = GetObject(data);
if (objectOfAnotherClass == null)
throw new WhatExceptionType1("objectOfAnotherClass is null.");
if (objectOfAnotherClass.SomeProperty < 0)
throw new WhatExceptionType2("SomeProperty must not be negative.");
}
假设 GetObject
使用了一些不受我控制的外部库,如果没有 data
的对象,这个库返回 null
存在并将负 SomeProperty
视为有效状态,因此不会引发异常。进一步想象 MyMethod
不能在没有 objectOfAnotherClass
的情况下工作,并且对于负的 SomeProperty
也没有意义。
WhatExceptionType1/2
在这种情况下抛出的正确异常是什么?
基本上我有四种选择:
1)
InvalidOperationException
,因为MyMethod
在上述条件下没有意义。另一方面,指南(以及 VS 中的 Intellisense)表示如果方法所属的对象处于无效状态,则应抛出 InvalidOperationException。现在对象本身不处于无效状态。而是输入参数data
和其他一些基于该参数的操作导致MyMethod
无法再操作的情况。2)
ArgumentException
,因为data
有一些值是该方法可以处理的,而其他值是该方法不能处理的。但是我无法通过单独检查data
来检查这一点,我必须在决定之前调用其他操作。3)
Exception
,因为我不知道要使用哪种其他异常类型,而且因为所有其他预定义异常都感觉过于专业,不适合我的情况。4)
MyCustomException
(我自己的异常类型派生自Exception
)。这似乎总是一个选项,但我担心当我开始遵循这种模式时,我必须为许多不同的错误条件定义许多特殊的异常类。
还有其他更好的选择吗?支持或反对这些选项的论点是什么?
提前感谢您的反馈!
最佳答案
如果存在有意义的内置异常,我会使用它们。如果不是,滚动您自己的异常是有意义的——即使它是一个扩展 Exception 的空类——因为这允许您检测特定的异常类型。例如,如果您只是抛出异常,您怎么知道异常是因为 objectOfAnotherClass
为空,而不是在 GetObject
中引发的异常?
总结一下:特定异常更好,因为您可以(可能)诊断特定案例并从中恢复。因此,使用内置的 .NET 异常(如果它们足够的话),或者滚动你自己的异常(exception)。
编辑:我应该澄清一下,我很少使用现有的异常并在其中添加一条消息。如果异常类型告诉您错误,它会使您的代码更具可读性,而不必调试、生成异常,然后检查消息以查看问题所在。
关于c# - 抛出正确类型的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4605610/