C#:多个catch子句

时间:2011-03-21 08:47:35

标签: c# exception-handling try-catch

请考虑以下事项:

try { 
    FileStream fileStream = new FileStream("C:\files\file1.txt", FileMode.Append); }
catch (DirectoryNotFoundException e) 
    { MessageBox.Show("Directory not found. " + e.Message); }
catch (IOException e) 
    { MessageBox.Show("Other IO Error. " + e.Message); }
catch (Exception e) 
    { MessageBox.Show("Other Error. " + e.Message); }

所有三个DirectoryNotFoundException条款或第一个条款是否会处理catch个异常?

5 个答案:

答案 0 :(得分:27)

只是第一个。该异常不会传播到所有匹配的catch子句。

从C#4规范,第8.9.5节:

  

指定异常类型的第一个catch子句或异常类型的基本类型被视为匹配。 [...]如果找到匹配的catch子句,则通过将控制转移到该catch子句的块来完成异常传播。

这里"已完成"部分表示控制权转移后,有效处理特殊处理的结束。

答案 1 :(得分:3)

只有第一个。捕捉块不会落空。

答案 2 :(得分:3)

只有第一个匹配的catch 捕获异常,如果你因为任何原因需要再次cacth它你将不得不再次抛出它,所以“外部”catch caluses将能够捕获它。

答案 3 :(得分:1)

只有第一个,第一个匹配的catch子句将处理异常

答案 4 :(得分:1)

这是处理异常的正确方法 - 从最具体的异常类型开始并返回。但是,请记住,如果您无法解决或处理异常,请不要抓住它。例如,我假设您的代码是在一些文件访问方法中,我会删除最后一个catch(Exception)块,因为这里没有什么可以做的(如果它是堆栈溢出,内存不足或某些其他严重的系统例外......)