我有以下几行代码:
FileInfo dbFile = new FileInfo(fileName);
dbFileSize = (long)dbFile.Length / 1024;//KB
new FileInfo(fileName)
和dbFile.Length
来电有8种可能的例外情况。我不能忽视它们。 我必须抓住他们。
您将如何处理 8 例外情况?单独抓(太多行)?除了捕获超级Exception
之外,只捕获一个?或者......
答案 0 :(得分:9)
正确的操作是忽略它们,除非您可以实际修复它们。
它们将传播到调用代码,这些代码可能能够修复它们,或者记录它们,或者其他东西。但除非你能改善你的水平,否则根本不要抓住它们。
答案 1 :(得分:3)
如果您知道如何处理它们(即,如果您可以纠正这种情况),或者在您的级别处理它们是有意义的,请抓住它们。否则,让更高级别的代码处理它。
另一件事。如果您要让更高级别的代码处理异常,您还可以捕获异常,然后使用不同的异常对象“换行”,然后抛出异常。新异常应该是在更高级代码的上下文中有意义的异常(即,调用使用API的代码的代码)。一般来说,这是一个很好的方法来阻止低级代码的细节从“泄漏”到更高级别(基本上你停止抽象泄漏)。
答案 2 :(得分:1)
正如其他人指出的那样,一般规则是:不要捕捉你无法处理的异常。鉴于您知道该怎么做,您应该单独捕获8个例外,请参阅指南[1]。您永远不应该抓住Exception
的原因是,您还会捕获像ThreadAbortException
这样的关键异常,这是您真正永远不应该做的。
答案 3 :(得分:0)
对于使用异常(如参数异常或空引用),通过在调用链中强制执行断言和检查来防止它们出现,以便尽早识别出有问题的输入。例如,您应该要求在用户输入的路径进入任何进一步的调用之前验证该用户输入的路径。如果抛出使用异常,则不应该捕获它们(除非是您的最终记录器和礼貌执行者。)
对于超出您控制范围的异常(例如文件在您最初检查后消失),如果您可以或需要调用方法进行检查并处理它,请在调用点处理它。例如,这完全取决于系统在无法再找到文件时所做的事情。
答案 4 :(得分:0)
考虑这种情况的另一种方法是捕获所有异常情况,否则上面的层会收到异常,但不知道如何处理异常。我将最终用户包括为“层”,以及其他不能识别异常的系统。因此,作为人类(!)的最终用户无法以其原生格式处理异常,因此您可以捕获代码中的所有异常并将其转换为人性化的格式,例如屏幕上的错误消息。该处理代码将是例如Windows窗体中的按钮点击事件处理程序。同样,如果调用代码的系统不能识别异常,那么您需要将异常编组为其他系统可以处理的格式。这也是您记录异常的地方。
否则,如果可以执行某种恢复,或者想要添加更多信息(包括原始异常作为innerException),则只需要捕获异常,这两种情况往往都是例外,而不是常态。