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

时间:2010-06-20 18:52:31

标签: .net exception-handling exception throw

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

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

我在设计选择方面很有趣......

1 个答案:

答案 0 :(得分:10)

StackTrace至少对我有意义。这个想法是可以传递Exception(作为对象),从方法返回等等。StackTrace仅在抛出和捕获异常时才是重要的。从某种意义上说,StackTrace实际上更像是抛出异常的属性,而不是Exception对象本身。

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

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