为什么.NET异常是可变的?

con*_*low 11 .net exception-handling exception throw

我想知道为什么基类库中的.NET异常类默认有一些可变成员

  • 为什么我可以改变Source,HelpLink和值Data,但不能改变其他任何像Message
  • 为什么抛出异常会重写StackTrace使它变得可变?将堆栈跟踪信息附加到现有跟踪是更好的设计(但仍然可变)?
  • .NET异常设计可能有哪些改进?

我只是在设计选择上很有意思......

Ste*_*ary 10

StackTrace对我来说很有意义,至少.这个想法是一个Exception(作为一个对象)可以传递,从方法等返回.这StackTrace只是一个异常,因为抛出并捕获异常.从某种意义上说,StackTrace实际上更多的是抛出异常的属性,而不是Exception对象本身.

关于其他属性的可变性,我认为这只是因为通过赋值属性而不是强制它们全部进入构造函数来构造实例更容易.请记住,在Exception设计时,C#没有可选参数.

您可以考虑重新设计where Exception和派生类是不可变的,但这需要异常工厂或构建器类.它只会从Exception更复杂的东西中衍生出来.