何时检查InnerException
类及其派生类的Exception
属性? Microsoft的“例外最佳实践”没有提供有关何时检查内部例外的任何建议。我应该只在异常被重新引发并被代码捕获时才这样做吗?即使我将try-catch
放在诸如System.IO.File.Move
之类的标准函数中,我也应该始终这样做吗?
答案 0 :(得分:2)
有时,开发人员会将一个异常(通常是Microsoft定义的一个异常)转换为另一种异常(通常是自己定义的异常)。
这可以简化API,例如如您使用File.Move()
给出的示例。代替了7种可能的Microsoft异常,这样的API可以只引发一个简单的“不起作用”异常,并在其中包含详细信息,因此您的代码仅需要处理一种类型的异常。
在使用第3方框架时,我会在开发阶段对其进行研究。如果它们倾向于为空,则为此编写代码没有任何价值。
如果您编写记录器/跟踪器或通用调试输出,我肯定会考虑的。
我知道有InnerExceptions的异常
答案 1 :(得分:2)
最终答案很简单:只要对您有用 ,这完全是上下文。对于绝大多数案例,除了报告以外,实际上根本不值得对例外进行检查。只是“做某事,哎呀,失败了”-与IMO using
相比,您通常应该拥有更多的finally
和catch
-因为通常您可以对异常进行处理,除了将其向上冒泡。
但是,在某些情况下,存在有用的上下文。经典示例包括AggregateException
,TargetInvocationException
和TypeInitializationException
或来自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
(该场景以外的所有内容都冒泡了)