gpt4 book ai didi

c# - 如何在库异常中包含附加信息

转载 作者:太空宇宙 更新时间:2023-11-03 21:30:53 24 4
gpt4 key购买 nike

我正在开发一个库,我想在库抛出的所有异常中包含额外的上下文信息,包括非图书馆特定的异常(exception)情况,例如System.NullReferenceException。 (这些附加信息很可能会帮助开发人员调试他们的代码和/或数据的问题。)编辑:我的库正在处理一些也可以非常嵌套的大数据结构。因此,我想将抛出异常时处理的字段的完整路径作为附加信息包含在内,例如MyClass.Field1.SomeArray[10].SomeOtherField.ThisFails。 (我认为在这种情况下添加异常(exception)情况将是一条非常有用的信息)。

解决方案 1. 我知道包装是在异常中包含额外上下文信息的推荐方法。但我认为它有一个很大的缺点:你必须改变异常的类型。因此,例如 OutOfMemoryException 将包含在一些特定于库的异常中,应用程序将更难处理此特定异常(开发人员必须检查 InnerException 属性的类型)。这就是为什么我想避免包装异常。 (反对包装的另一个考虑是我的库将与用户实现的一些对象一起工作,这些对象可能会抛出他们特定的异常,我不想修改这些异常的类型。)

解决方案 2。我决定使用 Exception.Data 字典将此附加信息包含在异常中。此解决方案的缺点是附加信息不会包含在 Exception.ToString() 的默认实现结果中。(我想在 Exception.ToString() 的结果中包含额外的信息,这样开发人员就可以很容易地看到它,这些开发人员会使用类似log.Write(ex.ToString());;这样,开发人员就不会学习如何从我的库中调用其他格式化方法。)

编辑:解决方案 3。我考虑使用反射将我的信息附加到 exception.Message 字段的末尾(因为这是只读的)。我应该避免这种情况有什么充分的理由吗?

对于这个问题是否有任何其他可能的解决方案可以避免所解释的缺点?如果没有其他更好的解决方案,以上哪种是最常见的实现方式?

编辑:我想说清楚,因为这是一个库,我无法控制用户将使用哪种异常日志记录以及他们将阅读多少库文档。我想通过在 ex.ToString() 的结果中包含尽可能多的信息来避免无意义的支持请求。

此外,性能对于这个库很重要(这可能只是为了营销,但它更重要)所以,对于表现良好的场景,我想避免任何额外的处理.也就是说,如果可能的话,我还想避免一些额外的检查,比如 if (data.Field == null) throw new ArgumenNullException("someField"); 因为,如果数据有问题,代码稍后会因 NullReferenceException 而失败,我可以在方便的位置捕获它并使用某种方法向其中添加数据。

最佳答案

如果您愿意添加一个新方法,例如 ToLogString(),作为 Exception 类型的扩展方法,它可以结合默认的 ToString() 包含来自 Exception.Data 的内容。

关于c# - 如何在库异常中包含附加信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24318030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com