C#:多个 catch 子句

问题描述 投票:0回答:6

考虑以下因素:

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
子句处理还是仅由第一个子句处理?

c# exception try-catch
6个回答
27
投票

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

来自 C# 4 规范,第 8.9.5 节:

指定异常类型或异常类型的基类型的第一个

catch
子句被视为匹配。 [...] 如果找到匹配的
catch
子句,则通过将控制转移到该
catch
子句的块来完成异常传播。

这里的“完成”部分表示控制权转移后,特殊处理实际上就结束了。


3
投票

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


3
投票

只有第一个匹配的 catch 捕获异常,如果您出于任何原因需要再次捕获它,则必须再次抛出它,以便“外部”catch caluses能够捕获它。


1
投票

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


1
投票

这是处理异常的正确方法——从最具体的异常类型开始,然后再回溯。但请记住,如果您无法采取任何措施来解决或处理异常,请不要捕获它。例如,我假设您的代码位于某些文件访问方法中,我将删除最后一个 catch (Exception) 块,因为您在这里无能为力(如果是堆栈溢出、内存不足或某些问题怎么办)其他严重的系统异常...)


0
投票

你可以试试这个

try
{
  // do something....
}
catch(Exception ex)
{
 if(ex is ArgumentException || ex is FormatException)
   {
      //do something
   }
   else
   {
      throw;
   }
}

或者更简单

try {
  // do somthing.
}
catch (Exception ex) when (ex is FormatException || ex is OverflowException)
{
    //do something
}
catch(Exception ex)
{
   throw ex;
}
© www.soinside.com 2019 - 2024. All rights reserved.