捕获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)
不可以。你应该从最具体的一般情况中捕获例外情况。
大部分派生到较少派生
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) { ... }