请考虑以下事项:
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
个异常?
答案 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)块,因为这里没有什么可以做的(如果它是堆栈溢出,内存不足或某些其他严重的系统例外......)