异常捕获

问题描述:

是你指定要赶上哪些异常异常捕获

try 
{ 
    ... 
} 
catch (NHibernate.ADOException exception) 
{} 

try 
{ 
    ... 
} 
catch (exception ex) 
{} 
+3

后者将不会编译,除非您碰巧有一个名为'exception'的类型。 – Joey 2010-08-24 10:40:14

之间的差别在catch块。因此,如果你有

try {} 
catch(Exception e){} 

它会捕获从Exception类派生的所有异常(因此所有例外)。如果您有:

try{} 
catch (NHibernate.ADOException exception){} 

它只会捕获ADOException或从ADOException派生的异常。所以如果你得到一个ArgumentException,它会通过,就好像没有try/catch一样。

+0

另外如果你期待指定的异常,它是一个很好的习惯,赶上它的实际类型,然后'异常'类型。在这种情况下,使用'NHibernate.ADOException'是更好的解决方案 – 2010-08-24 10:42:54

我假设你的意思

catch (Exception ex) {} 

与第二片段。

然后区别在于第一个将只捕获一个特定类型的异常,即NHibernate.ADOException,而第二个将会进入catch块以查找可能抛出的所有异常。

第二个通常是不好的做法,因为你声称处理所有可能的错误类型。但是,在最外层的范围内,对于任何通过的异常来说,它都是有意义的。

强烈不建议使用catch {Exception},因为这实际上隐藏了一个错误。在可能引发异常的每个地方,都需要捕获预期的异常类型,即使这需要编写更多的代码行。当引发意外的异常时,程序必须崩溃,这是解决该错误的唯一方法。