捕获异常并重新抛出一个新消息,保留实际类型。

3
我需要捕获异常catch (Exception ex),更改其消息并重新抛出。
如果我使用throw new Exception(newMessage, ex);,那么我会失去异常的运行时类型,对吗?
如果我使用throw;,那么我可以保留运行时类型,但是消息不会改变。
由于我正在捕获异常,我不知道ex可能是哪种派生类型,因此无法构造正确的类型。
当然,如果我使用throw ex;,我会失去堆栈跟踪信息。
有没有一种方法可以重新格式化ex的消息并重新抛出它,同时不丢失堆栈或运行时类型信息,而又不需要使用任何奇怪而脆弱的反射技巧?

抛出另一种类型(可能是应用程序类型),并将原始异常设置为内部异常。 - Steve's a D
为什么你不能只使用InnerException的最内层异常?你在上面有一个类型化的catch吗? - Manfred Radlwimmer
你必须使用继承自基类“Exception”的自定义异常类。这样,你还可以跟踪多层架构中原始异常发生的层,并能够在一个位置记录所有异常日志。 - Koder101
默认情况下,异常的“Message”属性是只读的。因此,除非您明确为特定的异常类型编写代码,否则无论如何都不能更改异常的消息。 - sstan
1个回答

2

既然您已经有效地消除了解决问题的所有合理方法,那么唯一剩下的答案就是“不行,您无法做到这一点”。异常的Message是只读的。即使使用“脆弱的反射技巧”也无法设置它,因为该属性是virtual的,因此对于任何特定的异常类型都不需要来自支持字段。以下类应该说明您的要求是不可能实现的:

sealed class OzymandiasException : Exception {
    public override string Message => "Look upon my message, ye mighty, and despair.";
}

当捕获到OzymandiasException时,无法生成任何实例,其Message将不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接