2.3.5 异常处理
异常是指在程序执行过程中出现的错误情况或意外行为。对程序中的异常处理是非常重要的,一般情况下,一个比较完整的程序中要尽可能考虑可能出现的各种异常,比如对数据库进行操作时可能的异常等等。
1. try-catch语句
C#提供了利用try-catch捕捉异常的方法,以帮助编程者处理异常。在try块中的任何语句产生异常,都会执行catch块中的语句来处理异常,而不是直接显示异常信息。try-catch语句的常用形式为:
try
{
语句序列
}
catch(异常类型 标识符)
{
异常处理
}
在程序运行正常的时候,执行try块内的程序。如果try块中出现了异常,程序就转移到catch块中执行。
在catch子句中,可以指定异常类型和标识符,一旦指定,就相当于声明了一个异常变量,这个异常变量是一个作用范围为整个catch块的局部变量,在catch块的执行过程中,异常变量描述了当前正在处理的异常,可以通过它来引用异常对象。如果在catch子句中没有定义异常变量,则该子句称为一般catch子句,其中的代码在事先不能确定会发生什么样的异常的情况下执行。
需要说明的是,一个try块后可以跟一个或多个catch块。如果有多个catch块,除了一个一般catch块外,其他每一个catch块可以用于处理一个特定类型的异常,这样使得程序可以更好地处理一些特殊异常,对于这些catch块,应该把处理特殊异常的catch块放在处理一般catch块的上面。
2. try-catch-finally语句
如果try后有finally块,不论是否出现异常,也不论是否有catch块,finally块总是会执行的,使用跳转语句也不能跳出finally块的执行。一般在finally块中做释放资源的操作,比如关闭打开的文件、关闭与数据库的连接等等。
try-catch-finally语句的常用形式为:
try
{
语句序列
}
catch(异常类型 标识符)
{
异常处理
}
finally
{
语句序列
}
3. throw语句
有时候在方法中出现了异常,不一定要立即把它显示出来,而是想把这个异常抛出并让调用这个方法的程序进行捕捉和处理,这时可以使用throw语句。它的格式为:
throw [表达式];
可以使用throw语句抛出表达式的值。注意表达式类型必须是System.Exception或从System.Exception派生的类的类型。
throw也可以不带表达式,不带表达式的throw语句只能用在catch块中,在这种情况下,它重新抛出当前正在由catch块处理的异常。
【例2-15】异常处理。
using System;
namespace TryCatchExample
{
class Program
{
static void F()
{
try
{
G();
}
catch (Exception err)
{
Console.WriteLine("方法F中捕获到: " + err.Message);
// 重新抛出当前正在由catch 块处理的异常err
throw;
}
}
static void G()
{
throw new Exception("方法G中抛出的异常。");
}
static void Main()
{
try
{
F();
}
catch (Exception err)
{
Console.WriteLine("方法Main中捕获到:" + err.Message);
}
Console.ReadLine();
}
}
}
输出结果:
方法F中捕获到:方法G中抛出的异常。
方法Main中捕获到:方法G中抛出的异常。