覆盖C#中的异常消息

Ido*_*dov 1 c#

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

可能吗?

Jon*_*eet 6

对于你要抛出的异常,你可以将消息传递给构造函数:

throw new ArgumentOutOfRangeException("name", "My custom message");
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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