2010-10-18 161 views
4

什么是正确的做法。捕捉异常C#

从最具体到最一般或相反的情况下捕捉异常。

如果我写

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

威尔的NullReferenceException NRE曾经被抓?

+19

很容易测试,肯定 – 2010-10-18 14:43:35

+0

真的很容易测试会发生什么事吗? – eomeroff 2010-10-22 21:51:04

+1

是的,只需在try块中放置一个新的NullReferenceException(),并且如果该catch语句未被调用,那么就没有其他情况可以测试。 – jcmcbeth 2013-02-14 15:56:29

回答

0

大多数特定第一

威尔的NullReferenceException NRE曾经被抓?

真正

没有,也不会被抓住

+0

Are you sure?在这个例子中,NRE如何被捕获? – DzinX 2010-10-18 14:46:18

+0

这不是真的,你可以检查 – Andrey 2010-10-18 14:48:58

+0

@Andrey你是什么意思? – 2010-10-18 14:50:10

2

不,你必须从最具体到去最普遍。你举的例子有看起来像

try 
{ 

} 
catch(NullReferenceException nre) 
{ 

} 
catch(Exception e) 
{ 

} 

看到here (MSDN)

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

而且我也不会赶上NullReferenceException,我会测试,如果我试图访问的值实际上访问它或之前不为空使用null coalescing operator (??)来确保此例外从不发生。

应该避免接触一般的Exception。恕我直言,你应该只在一些全局异常处理程序中执行此操作,因为每次调用某个方法时很少可以处理所有可能的异常。在这种情况下,你应该只捕捉一些特定的例外情况,并采取适当的行动。

1

号,您应该抓住从最具体的例外情况一般。

1

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

Source

0

为了被抓时,NullReferenceException应先放入追赶名单。

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

它指定要处理NullReferenceException以一种特殊的方式,你有一些具体的事情做。然后,让其他类型的例外通过最通用的捕获来落实。另一方面,应避免非特定的异常处理,因为此MSDN文章建议:Exception Handling

此外,最好在尝试访问它之前验证要访问的对象是否为null(在Visual Basic中为Nothing),而不是让代码访问对象并在其为空时抛出此异常。以下是此问题的有用链接:Exception Handling Best Practices in .NET

0

当然它从最具体到一般。

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