加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:52:57 所属栏目:百科 来源:网络整理
导读:我正在创建一个测试记录器,其中包含有关抛出的任何异常的信息,以便可以使用GUI正确显示它们. 使用以下构造是否安全: public class TestLogEntry { public System.Exception Exception { get; private set; } public TestLogEntry(/*...,*/ System.Exception
我正在创建一个测试记录器,其中包含有关抛出的任何异常的信息,以便可以使用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是一种可变类型.你可以在任何时候改变它的堆栈跟踪.因为这个原因,我想捕捉它的状态.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读