何时检查InnerException

问题描述 投票:1回答:2

何时检查InnerException类及其衍生物的Exception属性? Microsoft的“异常最佳实践”并未就何时检查内部异常提供任何建议。我是否应该只在重新抛出异常并在我的代码中捕获异常时才这样做?我是否应该一直这样做,即使我在try-catch中封装像System.IO.File.Move这样的标准函数?

c# .net exception clr
2个回答
2
投票

谁可能会使用这样的功能?

有时,开发人员将一个异常(通常由Microsoft定义的异常)转换为另一个异常(通常是自己定义的异常)。

这可以使API更简单,例如就像你用File.Move()给出的例子一样。而不是7个可能的Microsoft异常,这样的API可能只是抛出一个简单的“那不起作用”异常,其中包含详细信息,因此您的代码只需要处理一种类型的异常。

什么时候用?

在使用第三方框架的开发阶段,我会调查它们。如果它们往往是空的,那么为它编写代码是没有价值的。

如果您编写记录器/跟踪器或通用调试输出,我肯定会考虑它。

我知道有例外的InnerExceptions:

  • TargetInvocationException
  • AggregateException

2
投票

这里的答案很简单:只要它对你有用,这完全是上下文的。对于绝大多数情况而言,除了报告之外,实际上并不值得对异常进行多少检查;只是“做事,哎呀,失败” - 你应该通常比using,IMO有更多的finallycatch - 因为除了向上泡沫之外,你通常没有任何有用的例外。

但是,在某些情况下,有一些有用的背景。经典的例子是AggregateExceptionTargetInvocationExceptionTypeInitializationException或来自XmlSerializer的任何东西。这些非常罕见,因此您不希望明确地开始检查它们,除非您有充分的理由期待它们。就您的一般错误报告代码而言:是的,记录内部异常是有意义的,但.ToString()通常会自动执行此操作,IIRC。

作为一些涉及InnerException的实际代码的例子 - 在我的网络代码中有一个场景,我不关心只能通过外部和内部异常的组合检测到的非常特定的情况; when为我做这个工作:

try
{
    await _server.RunClientAsync(connection.Transport).ConfigureAwait(false);
}
catch (IOException io) when (io.InnerException is UvException uv && uv.StatusCode == -4077)
{ } //swallow libuv disconnect

(除了那个场景之外的所有东西都是冒泡的)

© www.soinside.com 2019 - 2024. All rights reserved.