捕捉异常处理

时间:2009-10-31 19:51:39

标签: c#

使用

之间有什么区别
catch(Exception ex)
{
   ...
   throw ex;
}

并使用

catch   //  might include  (Exception) 
{
   ...
   throw;
}

5 个答案:

答案 0 :(得分:12)

throw ex从那一点重新抛出异常对象。这通常很糟糕,因为它会破坏导致原始问题的有用调用堆栈信息。

throw从实际抛出的角度释放原始捕获的异常。它保留了到那一点的调用堆栈信息,而不是你捕获的点。

catch(Exception)catch基本上是相同的,除了第一个给你异常对象做某事,第二个没有。但两者都会抓住所有例外情况。它们与catch(SomeKindOfException)不同,后者仅捕获该特定类型的异常(或从该类型派生的更具体类型)。这适用于以下情况:

try
{
    //some file operation
}
catch(FileNotFoundException fnfex)
{
    //file not found - we know how to handle this
}
//any other kind of exception,
//which we did not expect and can't know how to handle,
//will not be caught and throw normally

答案 1 :(得分:4)

在框架1.x中使用不带参数的catch非常有用,可以捕获从非托管代码抛出的异常。从框架版本2(IIRC)开始,所有非托管异常都包含在托管的Exception对象中,因此不再使用无参数的catch。

无参数抛出并非特定于无参数catch,它可以在任何catch块中使用。不同之处在于,当使用throw;重新启动异常时,它不会覆盖最初抛出异常时的堆栈跟踪,因此这是重新抛出异常的正确方法。

不应在catch块中使用throw ex;,而应抛出包含要添加的信息的新创建的异常,并将原始异常作为内部异常。这样你就可以获得原始的失败点,以及你抓住它并重新抛出它的点。

因此,您不应该在问题的示例中使用任何一种组合。您始终指定异常类型,并且您只是重新启动异常:

catch (Exception ex) {
   ...
   throw;
}

或者抛出一个带有内部异常的新异常:

catch (Exception ex) {
   ...
   throw new ApplicationException("Ooops!", ex);
}

请注意,您应该很少捕获Exception基类,而是更适合您预期的错误的更具体的异常类。抓住你不知道如何处理的例外通常没有意义。

答案 2 :(得分:1)

好吧,第一个将擦除堆栈跟踪,并将其替换为您的投掷位置。第二个将抛出异常而不改变堆栈跟踪。

此外,“catch”将捕获任何抛出的内容,无论是否为异常。

第二个实际上相当于做“catch(object)”。

答案 3 :(得分:0)

第一个重置抛出异常中的堆栈跟踪属性

答案 4 :(得分:-1)

据我所知,它是一样的(使用Exception ..因为所有异常都来自该类)。当你只捕捉到一个异常的孩子时,或者当你有几个“抓住”捕捉不同的孩子时,它会变得不同。 也可能是你捕获异常,修改消息并将其丢弃。

相关问题