异常处理的注意事项

  注意 ⚠️,必须在更一般的异常捕获之前为比较特殊的异常提供 catch 块。如果 catch 块的顺序有误,应用程序就会编译失败。还要注意可以在 catch 块中抛出异常,方法是使用上一个示例中的方式,或使用下述表达式:

  1. throw;

  这个表达式会再次抛出 catch 块处理过的异常。如果以这种方式抛出异常,该异常就不会由当前的 try…catch…finally 块处理,而是由上一级的代码处理(但嵌套结构中的 finally 块仍会执行)。

例如,如果修改 ThrowException() 中的 try…catch…finally 块,如下所示:

  1. try
  2. {
  3. Console.WriteLine("ThrowException(\"nested index\")" +
  4. "try block reached.");
  5. Console.WriteLine("ThrowException(\"index\") called.");
  6. ThrowException("index");
  7. }
  8. catch
  9. {
  10. Console.WriteLine("ThrowException(\"nested index\") general"
  11. + " catch block reached.");
  12. throw;
  13. }
  14. finally
  15. {
  16. Console.WriteLine("ThrowException(\"nested index\") finally"
  17. + "block reached.");
  18. }

  则首先执行其中的 finally 块,再执行 Main() 中匹配的 catch 块,得到的控制台输出 如图 7-20 所示

图 7-20

图 7-20

  在这个屏幕截图中,Main() 函数输出了额外的几行,因为这个函数捕获了 System.IndexOutOfRangeException 异常。