2010-06-20 66 views
10

我不知道为什么从基类库的.NET的异常类,默认拥有一些可变成员为什么.NET异常是可变的?

  • 为什么我可以改变从DataSourceHelpLink和价值观,但不能改变其他任何类似的Message
  • 为什么抛出异常会重写StackTrace使其变得可变?追加堆栈跟踪信息到现有的跟踪会更好的设计(但仍然可以)?
  • .NET异常设计可能有哪些改进?

我只是在设计上选择感兴趣的......

回答

9

StackTrace对我来说很有意义,至少。这个想法是,一个Exception(作为一个对象)可能被传递,从方法返回等等。StackTrace只有在引发和捕获异常时才重要。从某种意义上说,StackTrace真的是越抛出异常,而不是Exception对象本身的的财产。

至于其他性质的可变性,我认为它只是因为它更容易将其分配给的属性,而不是强迫他们都到构造函数构造一个实例。请记住,在设计时刻Exception时,C#没有可选参数。

你可以考虑重新设计,其中Exception和派生类是不可变的,但是这需要一个异常工厂或生成器类。它只会从Exception派生出更加复杂的结果。

+0

好的,如果问题是将大量数据传递给异常,为什么'Message'属性是只读的? – ControlFlow 2010-06-20 19:14:47

+0

关于'StackTrace'的不错想法... – ControlFlow 2010-06-20 19:20:18

+0

'Message'是一个非可选的信息片段,因此将它放在构造函数中是有意义的。 – 2010-06-20 19:23:15

相关问题