考虑以下因素:
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
子句处理还是仅由第一个子句处理?
只是第一个。异常不会传播到 all 匹配的 catch 子句。
来自 C# 4 规范,第 8.9.5 节:
指定异常类型或异常类型的基类型的第一个
子句被视为匹配。 [...] 如果找到匹配的catch
子句,则通过将控制转移到该catch
子句的块来完成异常传播。catch
这里的“完成”部分表示控制权转移后,特殊处理实际上就结束了。
只有第一个。捕捉块不会掉落。
只有第一个匹配的 catch 捕获异常,如果您出于任何原因需要再次捕获它,则必须再次抛出它,以便“外部”catch caluses能够捕获它。
只有第一个,第一个匹配的catch子句会处理异常
这是处理异常的正确方法——从最具体的异常类型开始,然后再回溯。但请记住,如果您无法采取任何措施来解决或处理异常,请不要捕获它。例如,我假设您的代码位于某些文件访问方法中,我将删除最后一个 catch (Exception) 块,因为您在这里无能为力(如果是堆栈溢出、内存不足或某些问题怎么办)其他严重的系统异常...)
你可以试试这个
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;
}