何时检查InnerException

时间:2018-08-30 10:07:30

标签: c# .net exception clr

何时检查InnerException类及其派生类的Exception属性? Microsoft的“例外最佳实践”没有提供有关何时检查内部例外的任何建议。我应该只在异常被重新引发并被代码捕获时才这样做吗?即使我将try-catch放在诸如System.IO.File.Move之类的标准函数中,我也应该始终这样做吗?

2 个答案:

答案 0 :(得分:2)

谁会使用这种功能?

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

这可以简化API,例如如您使用File.Move()给出的示例。代替了7种可能的Microsoft异常,这样的API可以只引发一个简单的“不起作用”异常,并在其中包含详细信息,因此您的代码仅需要处理一种类型的异常。

何时使用?

在使用第3方框架时,我会在开发阶段对其进行研究。如果它们倾向于为空,则为此编写代码没有任何价值。

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

我知道有InnerExceptions的异常

  • TargetInvocationException
  • AggregateException

答案 1 :(得分:2)

最终答案很简单:只要对您有用 ,这完全是上下文。对于绝大多数案例,除了报告以外,实际上根本不值得对例外进行检查。只是“做某事,哎呀,失败了”-与IMO using相比,您通常应该拥有更多的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

(该场景以外的所有内容都冒泡了)