在try块中抛出异常

时间:2010-07-20 19:34:00

标签: c# exception-handling try-catch-finally

    try { 
        if (isFileDownloaded)
            //do stuff
        else
            throw new CustomException()
   } 
   catch (Exception e)
   {
       // something went wrong save error to log
   }
   finally
   {
       //release resources
   }

我的问题是catch会抓住try块中抛出的ApplicationException吗?是编码风格差吗?它应该用另一种方式写出来吗?

4 个答案:

答案 0 :(得分:23)

catch将捕获您的异常(以及发生的任何其他异常)。话虽如此,我尽量避免在可能的情况下编写这样的代码。

就个人而言,我认为没有理由对同一范围内抛出的异常进行异常处理(catch)。如果您可以在方法中处理错误 - 也将异常处理(即:logging)直接放在try块中。

使用catch对于捕获try块中方法引发的异常更有用。这会更有用,例如,如果您的// do stuff部分恰好调用了引发异常的方法。

另外,我建议不要捕获每个异常(Exception e),而是捕获正确处理的特定异常类型。一个例外是如果你在你的catch中重新抛出异常 - 即:使用它进行日志记录但仍然让它冒出调用堆栈。

答案 1 :(得分:7)

是的,它会抓住ApplicationException,因为它来自Exception

在大多数情况下处理基本异常应该没问题,除非你需要记录或做一些不同类型的异常 ......

try{
    if (isFileDownloaded)
       //do stuff
    else
       throw new ApplicationException();
}
catch(ApplicationException ae)
{
   // log it application exception here...
}

catch(Exception ex)
{
   // log all other exceptions here...
}
finally
{
   // release resources...
}

答案 2 :(得分:1)

是的,catch会捕获你的ApplicationException,是的,编码风格很差。作为一个很好的一般规则,只捕获特定的异常和那些你要做的事情,比如修复应用程序状态。

答案 3 :(得分:1)

此外,FYI,ApplicationException自.NET 2.0以来已被弃用,作为派生的例外。从来没有打算作为一个例外,所以你可能根本不应该使用它。