我见过许多创建自定义异常的情况,其中只使用了3个标准构造函数覆盖而没有额外的信息。
在这些情况下,我建议使用InvalidOperationException,因为实际上没有调用者可以捕获这些自定义异常。
例如,在switch语句中的默认块中使用:
public InvalidSwitchValueException()
: base() { }
public InvalidSwitchValueException(string message)
: base(message) { }
public InvalidSwitchValueException(string message, Exception innerException)
: base(message, innerException) { }
你会推荐什么?
答案 0 :(得分:3)
取决于。如果您打算像这样使用它:
try
{
}
catch (InvalidSwitchValueException)
{
// handle this special case differently
}
catch (Exception)
{
}
它比以下更加整洁:
try
{
}
catch (Exception e)
{
if (e.Message == "Check the message")
{
// handle this special case differently
}
}
如果它只是为了拥有不同的类型,而不打算在任何地方捕捉它,那么它就不会明白这一点。如果这样做,它将提高您的代码质量。想想如果你有多语言错误消息会发生什么(比如.NET本身就是这样)。 你不能也不应该依赖这条消息!决不!
Eric Lippert在评论中也提出了一个很好的观点:
这是一个永远不应该被捕获的异常,因为它表示调用者中应该修复的错误吗?如果是这样,那么设计异常以使bug易于查找和修复,而不是将异常设计为易于捕获。
命名异常的一个非常有用的方面是如果它们被抛出,它就更容易找到它们。作为一个例子:NullReferenceException
是最糟糕的(没有调用堆栈)它绝对没有帮助你分析问题。像CatDidntFindMouseException
这样的类型异常的检查和抛出为您提供了一个起点,并且可能是一个实际出错的线索。