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是一种可变类型.你可以在任何时候改变它的堆栈跟踪.因为这个原因,我想捕捉它的状态. 内存使用也很重要.异常有一些可能从未使用过的字段.你可以保存它们.此外,将其字段内联到您的日志消息对象将消除对象标头和对象引用.虽然经常出现例外情况,但收益微不足道. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |