使用以下构造是否安全:
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# – 保持异常对象是否安全?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)