Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么.NET异常是可变的?_.net_Exception Handling_Exception_Throw - Fatal编程技术网

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

为什么.NET异常是可变的?,.net,exception-handling,exception,throw,.net,Exception Handling,Exception,Throw,我想知道为什么基类库中的.NET异常类在默认情况下有一些可变成员 为什么我可以更改源、帮助链接和数据中的值,但不能更改任何其他内容,如消息 为什么抛出异常会重写StackTrace使其也可变?将堆栈跟踪信息附加到现有跟踪是否是更好的设计(但仍然是可变的) 在.NET异常设计中有哪些可能的改进 我只对设计选择感兴趣…至少对我来说,StackTrace是有意义的。其思想是可以传递异常(作为对象),从方法等返回异常。堆栈跟踪仅在抛出和捕获异常时才重要。从某种意义上说,StackTrace实际上更多

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

  • 为什么我可以更改
    帮助链接
    数据
    中的值,但不能更改任何其他内容,如
    消息
  • 为什么抛出异常会重写
    StackTrace
    使其也可变?将堆栈跟踪信息附加到现有跟踪是否是更好的设计(但仍然是可变的)
  • 在.NET异常设计中有哪些可能的改进

我只对设计选择感兴趣…

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

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


可以考虑一个重新设计,其中“代码>异常< /代码>和派生类是不可变的,但是这将需要一个异常工厂或Builder类。它只会使从

Exception
派生变得更加复杂。

好吧,如果问题是将大量数据传递到Exception中,那么为什么
Message
属性是只读的?
Message
是一条非可选的信息,因此将其放在构造函数中是有意义的。