在try块中抛出异常

Qui*_*ncy 16 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
   }
Run Code Online (Sandbox Code Playgroud)

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

Ree*_*sey 24

catch会赶上你的异常(和出现的任何其他).话虽这么说,我尽量避免在可能的情况下编写这样的代码.

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

使用a catch更有用,IMO,用于捕获try块中方法抛出的异常.这将更有用,例如,如果您的// do stuff部分碰巧调用引发异常的方法.

此外,我建议不要捕获每个异常(Exception e),而是可以正确处理的特定类型的异常.这种情况的一个例外是,如果您在捕获中重新抛出异常 - 即:将其用于记录目的但仍然让它冒出调用堆栈.

  • 您可以在其他引发异常的捕获中执行的任何操作.您只应在特殊情况下提出例外情况.另外,你不应该习惯于调用异常对象`e`.这将与事件处理程序中的`EventArgs`参数冲突. (3认同)
  • 假设我有一个方法可以读取一些带有指令的 XML 文件。它可能会因磁盘 I/O 或 XML 解析而引发异常,但预计这两种情况都很少见。它还可能发现 XML 内容在语义上无效,这种情况也很少见。假设我们已经有一个记录失败的 catch 块,那么当我们遇到语义冲突时抛出异常有什么不好呢? (2认同)

xan*_*ded 8

是的,它会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...
}
Run Code Online (Sandbox Code Playgroud)