覆盖C#中的异常消息

时间:2015-07-14 06:08:34

标签: c#

有没有办法覆盖异常消息?
我不想创建自定义异常,但要覆盖现有异常的消息 例如: 每次抛出ArgumentOutOfRangeException时,我都希望它包含我的消息而不是默认消息。

有可能吗?

3 个答案:

答案 0 :(得分:6)

对于投掷的例外情况,您只需将邮件传递给构造函数:

throw new ArgumentOutOfRangeException("name", "My custom message");

请注意,此处name是导致问题的参数的名称。在C#6中,您应该使用nameof运算符来实现这种重构安全:

public void Foo(int x)
{
    if (x > 10)
    {
        throw new ArgumentOutOfRangeException(nameof(x), "That's too big");
    }
}

您无法修改其他代码抛出的异常消息,但可以捕获异常并重新抛出另一个异常:

try
{
    ...
}
catch (FooException e)
{
    // Keep the original exception
    throw new BarException("Some message", e);
}

我会尽量避免这样做太多。如果您正在考虑向用户显示异常消息,我通常会回避这一点 - 他们真的瞄准了开发人员。例如,您建议的ArgumentOutOfRangeException通常应该指出代码中的错误而不是某些外部条件(如网络故障或其他) - 用户无法对此做任何事情的bug;这是你应该解决的问题。网络故障或类似情况对于用户采取行动至少更合理,但坦率地说,通常不会清楚事件链是什么。

答案 1 :(得分:2)

Exception.Message property被声明为只读,所以不,你无法更改预先存在的Message对象的Exception。 (这同样适用于派生的异常类型。)

可以设置您自己throw的异常的消息文本:通常,您将消息文本传递给异常构造函数:

throw new ArgumentException("Frobbled arguments are not accepted", paramName: …);
//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

定义自己的异常类型时,应遵循此协议;请参阅本答复末尾的部分。

您想要更改现有的例外对象' s Message - 替代方案:

  • 抓住原始异常并从中导出一个除了消息之外相同的新异常:

    …
    catch (ArgumentException ex)
    {
        throw new ArgumentException("New message text", paramName: ex.ParamName);
    }
    

    这通常不是一个非常好的主意,因为您可能会丢失ex中包含的状态数据(例如其堆栈跟踪和InnerException)。但在这种情况下它可能会正常工作。

  • 将异常包装在新的异常中,使其成为InnerException

    …
    catch (ArgumentException ex)
    {
        throw new ArgumentException("New message text", innerException: ex);
    }
    

    这样更好,因为保留了原始异常的所有状态。但是,在ArgumentException的特定情况下,实际的异常信息包含在InnerException中并不明显。

如何确保您自己的异常类允许设置消息等:

定义新的异常类型时,由于上述原因,定义接受消息文本和/或内部异常的构造函数非常重要。所以自定义异常类至少会有这些构造函数:

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

答案 2 :(得分:0)

您可以使用try .. . catch

        try
        {
            //Code here regarding array indexing
        }
        catch (ArgumentOutOfRangeException ex)
        {
            throw new ArgumentOutOfRangeException("exception", "New Custom Message");
            //Or show new message
            MessageBox.Show("Your custom Message");
        }