捕获exceptionC#

什么是正确的方法。

捕获从最具体到最普遍或相反的exception。

如果我写

try { ... } catch( Exception e ) { ... } catch( NullReferenceException nre ) { ... } 

NullReferenceException是否会被捕获?

最具体的是先

NullReferenceException是否会被捕获?

真正

不,它不会被抓住

 try { ... } catch( NullReferenceException nre ) { ... } catch( Exception e ) { ... } 

另外我不会捕获NullReferenceException ,我会测试我试图访问的值在实际访问它之前是否为null或使用null合并运算符(??)以确保此exception永远不会发生。

应避免捕获一般Exception 。 恕我直言,你应该只在一些全局exception处理程序中执行此操作,因为每次调用方法时很少处理所有可能exception的情况。 在这种情况下,您应该只捕获一些特定的例外(如果有)并采取适当的措施。

不,你必须从最具体到最一般。 你的例子必须看起来像

 try { } catch(NullReferenceException nre) { } catch(Exception e) { } 

看到这里(MSDN)

不,不会。

它按照你放置的顺序排列。 将最具体的例外放在顶部,将一般放在底部。

http://msdn.microsoft.com/en-us/library/0yd65esw.aspx

不可以。你应该从最具体的一般情况中捕获例外情况。

大部分派生到较少派生

try块可以抛出多个exception,可以通过使用多个catch块来处理。 请记住,更专业的catch块应该在广义块之前出现。 否则编译器将显示编译错误。

资源

为了被捕获, NullReferenceException应该是catch-list中的第一个。

 try { ... } catch (NullReferenceException ex) { .... } catch (Exception ex) { ... } 

这指定您希望以特定方式处理NullReferenceException ,您有特定的事情要做。 然后,让其他类型的exception通过最通用的捕获。 另一方面,应该避免非特定的exception处理,因为这篇MSDN文章建议: Exception Handling

此外,最好在尝试访问它之前validation要访问的对象是否为null(在Visual Basic中为Nothing),而不是让代码访问该对象并在它为null时抛出此exception。 这是一个有用的链接: Exception Handling Best Practices in .NET

当然它从最具体到一般。

 try { ... } catch (IOException ex) { .... } catch (Exception ex) { ... }