是否仅在涉及消息时使用自定义异常?

时间:2014-08-26 13:16:20

标签: c# exception

我见过许多创建自定义异常的情况,其中只使用了3个标准构造函数覆盖而没有额外的信息。

在这些情况下,我建议使用InvalidOperationException,因为实际上没有调用者可以捕获这些自定义异常。

例如,在switch语句中的默认块中使用:

public InvalidSwitchValueException()
            : base() { }

        public InvalidSwitchValueException(string message)
            : base(message) { }

        public InvalidSwitchValueException(string message, Exception innerException)
            : base(message, innerException) { }

你会推荐什么?

1 个答案:

答案 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这样的类型异常的检查和抛出为您提供了一个起点,并且可能是一个实际出错的线索。