使用Exception类捕获每个异常是否正确?如果不是那么什么?

时间:2010-08-12 01:23:50

标签: c# .net exception exception-handling

使用Exception类捕获每个异常是否正确?如果不是那么在try catch块中捕获异常的正确序列应该是什么?

e.g

try{
       .
       .
       some code
       .
   }
   catch(Exception ex)
   {
       throw ex;
   }

5 个答案:

答案 0 :(得分:15)

不,这是错误的。

  1. 只抓回去是没有意义的。

  2. 错误地重新抛出,导致丢失堆栈跟踪。重新抛出的正确方法(当重新抛出是有道理的时候),只是:throw;

  3. 如果要捕获一个异常然后再抛出另一个异常,则应将第一个异常保留为第二个异常。这是通过将其传递给构造函数来完成的。

  4. 底线:只捕捉您知道如何处理的例外情况。

答案 1 :(得分:5)

如果您在捕获之后立即抛出异常 - 这与完全没有try / catch块的情况基本相同。

捕获可能发生的特定异常。

例如,您尝试保存文件但由于某种原因无法写入:

    try
    {
      SaveFile();
    }
    catch(FileIsReadOnlyException)
    {
      //do whatever to recover
    }
    catch(Exception ex)
    {
      //If we hit the generic exception, we're saying that we basically have 
      //no idea what went wrong, other than the save failed.
      //
      //Depending on the situation you might want to sink and log it, i.e. do nothing
      //but log it so you can debug and figure out what specific exception handler to
      //add to your code -- or you might want to try to save to a temporary file and
      //exit the program.
      //
      //If you were UpdatingAnAdvertisement() or doing something else non-critical
      //to the functioning of the program, you might just let it continue and
      //do nothing.
      //
      //In that case, you can just omit the generic catch.
    }

答案 2 :(得分:4)

在我看来,您通常应该尝试捕获您希望从try块中调用的代码中获得的异常,并让其余的异常被捕获。例如:

try
{
    // ...  some code that you know may throw ArgumentException or any other known exceptions
}
catch (ArgumentException ex)
{
    // ... handle the exception with a good idea of why it was thrown
}

在catch块中,您现在可以以干净,特定的方式处理错误,因为知道try块中的某个地方传递了无效的参数。例如,您可以提醒用户他们提供了无效参数。

如果发生了一些您没想到的事情(例如NullReferenceException),您可能不知道如何从中恢复,所以通过不捕获它,您将责任委派给组件的使用者来处理一般的异常情况。

简而言之,当您知道如何处理或更正错误时,您应该捕获异常,并允许未知错误被捕获到调用链的更高位置

有意义吗?

答案 3 :(得分:2)

首先要抓住大多数特定的例外情况。

    try
    {
        // some file system code
    }
    catch (DirectoryNotFoundException e1)
    {
        // do something about it
    }
    catch (IOException e2)
    {
        // do something else about it
    }
    catch (Exception e)
    {
        // most generic catch - probably just dump onto screen or error log
    }

重新调整是为了更容易调试 - 这不是告诉用户错误的方法。正确的方法:

    try
    {
        // some code that does X
    }
    catch (Exception e)
    {
        throw new Exception("describe X and parameters to it where applicable", e);
    }

答案 4 :(得分:1)

并不是说它不正确,因为重新抛出异常不是你应该做的。重新抛出它的原因有很多,其中包括可维护性,性能和良好的编码实践等。不幸的是,编译器允许它。

至于何时应该捕获异常,一个好的经验法则是需要在您希望代码处理异常的时候捕获异常。