c# - 捕获异常并使用保留实际类型的新消息重新抛出

标签 c# exception

我必须捕获(Exception ex),更改它的消息,然后重新抛出它。

如果我throw new Exception(newMessage, ex);,那么我就失去了异常的运行时类型,对吗?

如果我throw;,那么我可以保留运行时类型但消息不会改变。

因为我正在捕捉,所以我不知道派生类型 ex 可能是什么,所以我无法构造正确的类型。

当然,如果我 throw ex; 我会丢失堆栈跟踪。

有没有办法重新格式化 ex 的消息并在不丢失堆栈或运行时类型信息的情况下重新抛出它,而不求助于任何奇怪的脆弱反射黑客?

最佳答案

由于您已经有效地排除了问题的所有合理解决方案,因此剩下的唯一答案是“不,您不能这样做”。 ExceptionMessage 是只读的。它甚至不能使用“脆弱的反射 hacks”来设置,因为该属性是 virtual,因此对于任何特定的异常类型,根本不需要来自支持字段。下面的类应该证明你的需求是不可能的:

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

无法生成任何 OzymandiasException 实例,当被捕获时将具有不同的 Message

关于c# - 捕获异常并使用保留实际类型的新消息重新抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37577629/

相关文章:

c# - 如何使用 Entity Framework 选择正确的并发/锁定机制

c# - 如何使用 Process 对象获取实例

c++ - 无法捕获 atan2 域错误

ios - iOS 7-捕获内部库错误异常

c# - 无法反序列化 XML

c# - 无法使用 PhantomJS、Selenium 通过 XPath 将文本发送到 iFrame 元素

c# - CS5001 : exe does not contain a static 'Main' method suitable for an entry point

java - 简单的数学到英语计算器

c# - 如何使用 try and catch 捕获 C# 中的所有异常?

python - selenium.common.exceptions.InvalidSelectorException 与 "span:contains(' 字符串')”