【问题标题】:Throw an exception in try catch block在 try catch 块中抛出异常
【发布时间】:2011-03-18 15:27:13
【问题描述】:
try { 
  if (isFileDownloaded)
   // do stuff
  else
   throw new CustomException()
} 
catch (Exception e)
{
  // something went wrong to save the error to log
}
finally
{
  //release resources
}

我的问题是catch 会捕获在 try 块中抛出的ApplicationException 吗?是不是编码风格很差?

应该换成别的写法吗?

【问题讨论】:

  • 什么是ApplicationException

标签: c# exception try-catch-finally


【解决方案1】:

是的,它将捕获ApplicationException,因为它派生自Exception

在大多数情况下处理基本异常应该没问题除非您需要记录或使用不同类型的异常做某事...

try {
    if (isFileDownloaded)
       doSomeThings();
    else
       throw new ApplicationException("Something expectedly unexpected happened.");
}
catch(ApplicationException e)
{
   // log application exception here...
}
catch(Exception e)
{
   // log all other exceptions here...
}
finally
{
   // release resources...
}

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 你在 catch 中可以做的任何事情都可以在引发异常的 else 中做。您应该只在特殊情况下引发异常。顺便说一句,您不应该习惯于调用异常对象e。这将与事件处理程序中的EventArgs 参数发生冲突。
    • @Philip:“你可以在 catch 中做的任何事情都可以在引发异常的 else 中做。” - 那是我的观点:) 至于你的其他论点,我同意一个观点,但我个人对命名异常对象 e 没有问题(尽管我通常使用更有意义的名称),因为它们很少直接与 EventArgs 一起使用.
    • 假设我有一个方法可以读取一些带有指令的 XML 文件。由于磁盘 I/O 或 XML 解析,它可能会引发异常,但预计这两种情况都很少见。它还可以发现XML的内容在语义上是无效的,这也是很少见的。鉴于我们已经有一个记录失败的 catch 块,当我们遇到语义冲突时抛出异常有什么不好?
    • @Steven:我同意在某些情况下可以这样做 - 但是,你的两个想法都属于我的最后一句话(“这个的一个例外......” - 我可能会抓住那些记录它们,但重新扔掉它们。
    • @Steven:我不会抛出一个只会在这种情况下被吞没的异常——我宁愿明确地处理它。
    【解决方案3】:

    是的,catch 会捕获您的 ApplicationException,是的,它的编码风格很差。作为一个好的一般规则,只捕获特定的异常以及您将要处理的那些异常,例如修复应用程序状态。

    【讨论】:

      【解决方案4】:

      另外,仅供参考,ApplicationException 自 .NET 2.0 以来已被弃用,作为派生的例外。它从来没有打算作为一个异常自行抛出,所以你可能根本不应该使用它。

      【讨论】:

      • FxCop 强制执行这些规则。您不能抛出基本异常或从ApplicationExceptionSystemException 派生。这些是基本例外以及Exception 本身
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 2020-12-16
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多