有没有办法覆盖异常消息?
我不想创建自定义异常,但要覆盖现有异常的消息
例如:
每次抛出ArgumentOutOfRangeException
时,我都希望它包含我的消息而不是默认消息。
有可能吗?
答案 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: …);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
定义自己的异常类型时,应遵循此协议;请参阅本答复末尾的部分。
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");
}