1、异常的概念
异常是在运行期间代码中产生的错误,或者由代码调用的函数产生的错误。
示例: int[] myArray = {1, 2, 3, 4};
myArray[4] = 5;
运行上述代码会产生如下异常信息:
Index was outside the bounds of the array.
产生的异常叫做System.IndexOutOfRangeException(数组下标越界异常)。
2、异常处理
C#包含结构化异常处理语法。
可以使用try、catch和finally三个关键字标记出能处理异常的代码和指令,如果发生异常,就使用指令处理异常。
它们都有一个关联代码块,必须在连续的代码行中使用。
3、异常处理基本结构
try { // code block } catch(<exceptionType> e) { // code block } finally { // code block }
- 可以只有try块和finally块,而没有catch块,或者有一个try块和好几个catch块。
- 如果有一个catch块或多个catch块,finally块是可选,否则是必选的。
- try块:包含抛出异常的代码。抛出分两种:生成或导致。
- catch块:包含抛出异常时要执行的代码。catch块可以使用<exceptionType>,设置只响应特定的异常类型,以便提供多个catch块。可省略参数,让一般catch块响应所有异常。
- finally块:包含总是会执行的代码,如果没有产生异常,则在try块执行完后执行,如果产生异常,则在catch块后执行,或者在未处理的异常上移到调用堆栈之前执行。
上移到调用堆栈表示,结构化异常处理允许嵌套try...catch...finally,可以直接嵌套,也可以在try块包含的函数调用中嵌套。例如,如果在被调用的函数没catch能处理某个异常,就由调用代码中的catch块处理。如果始终没有catch块处理,则终止应用程序。finally块在此之前处理,是因为存在这个块,否则也可以在try...catch...finally结构的外部放置代码。
4、异常发生后事件处理顺序
- try块在发生异常的地方中断执行程序。
- 如果有catch块,就检查该块是否匹配已抛出的异常类型。
- 如果没有catch块,就执行finally块。
- 如果有catch块,但它与发生异常的类型不匹配,就检查是否有其他catch块。
- 如果有catch块匹配已发生的异常类型,就执行它包含的代码,再执行finally块。
- 如果catch块都不匹配已发生的异常类型,就执行finally块。
5、异常处理注意事项
- 必须先捕获特殊异常,再处理一般异常。
- catch块中也可以抛出异常。
- 如果在catch块中抛出异常,将由上一级代码处理异常。
6、异常处理示例
using System; namespace TException { class program { static string[] eTypes = { "none", "simple", "index", "nested index" }; static void Main(string[] args) { foreach(string eType in eTypes) { try { Console.WriteLine("Main() try block reached."); Console.WriteLine("ThrowException(\"{0}\")", eType); ThrowException(eType); Console.WriteLine("Main() try block continue."); } catch(System.IndexOutOfRangeException e) { Console.WriteLine("Main() System.IndexOutOfRangeException catch block reached. Message: \n\"{0}\"", e.Message); } catch { Console.WriteLine("Main() general catch block reached."); } finally { Console.WriteLine("Main() finally block reached."); } Console.WriteLine(); } } static void ThrowException(string exceptionType) { Console.WriteLine("ThrowException(\"{0}\") reached.", exceptionType); switch(exceptionType) { case "none": Console.WriteLine("Not throwing an exception."); break; case "simple": Console.WriteLine("Throwing System.Exception."); throw(new System.Exception()); break; case "index": Console.WriteLine("Throwing System.IndexOutOfRangeException."); eTypes[4] = "error"; break; case "nested index": try { Console.WriteLine("ThrowException(\"nested index\") try block reached."); Console.WriteLine("ThrowException(\"index\") called."); ThrowException("index"); } catch { Console.WriteLine("ThrowException(\"nested index\") general catch block reached."); throw(new System.Exception()); } finally { Console.WriteLine("ThrowException(\"nested index\") finally block reached."); } break; } } } }
结果显示:
时间: 2024-10-16 05:34:19