2011-01-10 24 views
2

我有下面几行代码:如何处理代码中的API /库异常?

FileInfo dbFile = new FileInfo(fileName); 
dbFileSize = (long)dbFile.Length/1024;//KB 

有来自new FileInfo(fileName)dbFile.Length通话8个可能的例外。我不能忽视它们。 我得赶他们

你打算怎么处理那些例外?单独抓住他们(太多线)?通过捕捉超级Exception只抓住一个除了?或...

+0

所有8个例外的处理行为是否相同?或者你是否需要类型的“开关盒”? – Ani 2011-01-10 16:30:03

+0

是的,但我可能需要更具体的消息供以后使用。 – 5YrsLaterDBA 2011-01-10 16:46:01

回答

1

正如其他人指出的一般规则是:不要捕捉你无法处理的异常。鉴于您知道该怎么做,您应该单独查看8个例外情况,请参阅指南[1]。你永远不应该抓住Exception的原因是,那么你也会发现像ThreadAbortException这样的重要例外,你真的不应该这样做。

[1]:http://msdn.microsoft.com/en-us/library/ms229005.aspx

9

正确的操作是忽略它们,除非您确实可以修复它们。

他们将传播到可能能够解决它们,或记录他们,或什么的调用代码。但是除非你能够改善你的水平,否则不要抓住他们。

3

如果你知道如何处理它们(即,如果你能纠正这种情况),或者在你的级别处理它们是有意义的。否则,让高级代码处理它。

另一件事。如果您打算让更高级别的代码处理异常,您也可以捕获异常,然后用不同的异常对象“换行”,然后抛出异常。新的异常应该是在更高级代码(即调用使用API​​的代码的代码)的上下文中有意义的异常。通常,这是一个很好的方法,可以阻止较低级代码从“泄漏”到更高级别的细节(实质上是停止抽象泄漏)。

0
  • 对于使用异常(如参数异常或空引用),防止他们发生的,这样有问题的输入尽早确定执行断言和检查,一路沿着你调用链才。例如,您应该要求用户输入的路径在进入任何进一步调用之前进行验证。如果使用异常被抛出,它们不应该被捕获(除了最终的记录器和礼貌execution子手除外)。

  • 对于超出您的控制范围的异常(例如,在最初检查它之后文件会消失),请在如果可以,或者需要调用方法进行检查并处理,则调用点。举例来说,这一切都取决于如果文件无法再找到时系统要做的事情。

0

另一种方式来思考这个问题,以捕获所有异常,否则上面的层将会收到异常,但不知道如何处理异常。我将最终用户包含为“图层”,以及其他并不特别注意的系统。因此,作为人类(!)的最终用户无法处理其原生格式的异常,因此您可以捕获代码中的所有异常,并将其转换为人性化的格式,例如屏幕上的错误消息。此处理代码将位于Windows窗体中的按钮单击事件处理程序中。同样,如果调用代码的系统不是异常的,那么您需要将异常编组为一种其他系统可以处理的格式。这也是您记录异常的地方。另外,如果您可以执行某种恢复,或者您想要添加更多信息(包括原始异常作为innerException),那么您只需要捕获异常,这两者往往是非常规异常。