捕捉exception处理

使用之间有什么区别

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

和使用

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

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

从实际抛出的那一点开始抛出原始捕获的exception。 它会保留到该点的调用堆栈信息,而不是您捕获的点。

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

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

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

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

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

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

或者你抛出一个内部exception的新exception:

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

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

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

此外,“catch”将捕获任何被抛出的东西,无论它是否是例外。

第二个实际上相当于做“捕获(对象)”。

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

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