何时检查InnerException
类及其衍生物的Exception
属性? Microsoft的“异常最佳实践”并未就何时检查内部异常提供任何建议。我是否应该只在重新抛出异常并在我的代码中捕获异常时才这样做?我是否应该一直这样做,即使我在try-catch
中封装像System.IO.File.Move
这样的标准函数?
有时,开发人员将一个异常(通常由Microsoft定义的异常)转换为另一个异常(通常是自己定义的异常)。
这可以使API更简单,例如就像你用File.Move()
给出的例子一样。而不是7个可能的Microsoft异常,这样的API可能只是抛出一个简单的“那不起作用”异常,其中包含详细信息,因此您的代码只需要处理一种类型的异常。
在使用第三方框架的开发阶段,我会调查它们。如果它们往往是空的,那么为它编写代码是没有价值的。
如果您编写记录器/跟踪器或通用调试输出,我肯定会考虑它。
我知道有例外的InnerExceptions:
这里的答案很简单:只要它对你有用,这完全是上下文的。对于绝大多数情况而言,除了报告之外,实际上并不值得对异常进行多少检查;只是“做事,哎呀,失败” - 你应该通常比using
,IMO有更多的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
(除了那个场景之外的所有东西都是冒泡的)