c# – 保持异常对象是否安全?

c# – 保持异常对象是否安全?,第1张

概述我正在创建一个测试记录器,其中包含有关抛出的任何异常的信息,以便可以使用GUI正确显示它们. 使用以下构造是否安全: public class TestLogEntry { public System.Exception Exception { get; private set; } public TestLogEntry(/*...,*/ System.Exception ex 我正在创建一个测试记录器,其中包含有关抛出的任何异常的信息,以便可以使用GUI正确显示它们.

使用以下构造是否安全:

public class TestLogEntry {    public System.Exception Exception { get; private set; }    public TestLogEntry(/*...,*/ System.Exception exception = null) {        //...        Exception = exception;    }}

或者以下会更好吗?

public class TestLogEntry {    public string StackTrace { get; private set; }    public System.Type ExceptionType { get; private set; }    public string ExceptionMessage { get; private set; }    public TestLogEntry(/*...,*/ System.Exception exception = null) {        //...        if (exception != null) {            StackTrace = exception.StackTrace;            ExceptionType = exception.GetType();            ExceptionMessage = exception.Message;        }    }}

虽然第一种方法更灵活(因为它可以包含其他自定义数据),但我担心的是:

>长时间坚持异常对象.
>如果异常对象阻止大型对象被垃圾回收,则使用大量内存.
>超出上下文访问时返回错误值的异常.

Q1.以上问题是否有效?

Q2.异常对象通常会引用很多其他数据吗?

解决方法 您的顾虑是有效的:异常对象可能会保留在任意其他对象上.这在实践中非常罕见.实际上我从未见过使用的Exception.Data属性.但我已经看到一个Exception派生类使用自定义字段保持大的东西:WebException有一个WebResponse属性!

所以你看到你可能会保持活力甚至像非托管资源一样昂贵.

我实际上会复制出信息并丢弃异常.记得还要复制InnerException.

另一个问题可能是Exception是一种可变类型.你可以在任何时候改变它的堆栈跟踪.因为这个原因,我想捕捉它的状态.

内存使用也很重要.异常有一些可能从未使用过的字段.你可以保存它们.此外,将其字段内联到您的日志消息对象将消除对象标头和对象引用.虽然经常出现例外情况,但收益微不足道.

总结

以上是内存溢出为你收集整理的c# – 保持异常对象是否安全?全部内容,希望文章能够帮你解决c# – 保持异常对象是否安全?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1217923.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存