黑马程序员_ 异常处理

------- Windows Phone 7手机开发.Net培训、期待与您交流! ------- 

 异常处理

 在项目开发过程中或产品发布后,程序运行时出现错误的情况很常见。程序在执行时遇到的任何错误情况或意外行为叫做异常。应用程序必须能够统一处理在执行期间发生的错误。.NET Framework公共语言运行库提供了一个模型,来防止程序无法按照预期执行给用户造成重大的损失。

什么是异常

异常用来表示在应用程序执行期间发生的错误,以及其他的意外行为。C#程序语言存在异常处理机制。它是一种结构化的、统一的和类型安全的处理机制,以统一的方式通知程序发生的错误。C#程序语言中的异常用于处理系统级和应用程序级的错误状态。

导致异常的原因

在应用程序运行时,发生异常的原因是多种多样的,如除数为0、堆栈溢出等。导致异常的原因:

在执行语句和表达式(C#语言)的过程中,有时会出现一些例外情况,从而使得某些操作无法正常完成,此时就会引发一个异常。

应用程序使用throw语句特意产生一个异常,此时将引发一个异常。

理解异常的定义和产生异常的原因后,下面要讲解的就是捕获异常并对其进行处理。

捕捉异常——try语句

C#中可以使用try语句来捕捉在程序的执行期间发生的各种异常。try语句可以包含try块、catch块和finally块。try语法形式和try块、catch块、finally块的具体说明:

try块:一般包含有可能发生异常的代码。

catch块:包含出现异常时需要执行的响应代码。

finally块:一般包含确保一定执行的代码,如资源清理操作等。

try

{

                    //有可能发生异常的代码块

}

catch

{

                 //当try块中的代码发生异常时,响应的代码

}

 

finally

{

              //不管try块中的代码是否发生异常,该代码块一定执行

}

一个try语句只能有一个try块。且最多包含一个finally块。也就是说,一个try语句要么不包含finally块,要么只包含一个finally块。

另外,一个try语句可以不包括catch块,也可以包括一个或多个catch块。

最为常用的try语句组合的语法形式,它只包含一个try块、一个catch块和一个finally块。

下面创建一个类型为byte的b变量,并在try语句计算b变量和2000的和,同时使用checked语句检查这一计算操作。如果这一计算操作发生异常,则在catch块中显示异常信息。

class Program

{

   static void Main(sting[] args)

   {

      try

      {

            byte b = 10;

            b = checked((byte)(b + 2000));

      }

      catch ( Exception e )

      {

            Console.WriteLine(e.Message);

      }

   }

}

上述语句执行之后,“b=checked((byte)(b+2000))”语句执行时发生异常,catch块会捕获该异常,并显示“算术运算导致溢出”信息。

使用try语句将“abcdefg+10”字符串转换为一个整数,结果保存为i变量。该try语句包含一个try块和两个catch块。

第一个catch块使用System.FormatException类捕获异常,并显示异常的信息。

第二个catch块使用System.Exception类捕获异常,并显示异常的信息。

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "abcdefg+10";
            int i = -1;
            try
            {
                i = Int32.Parse(str);
            }
            catch (System.FormatException ex)
            {
                Console.WriteLine("catch1_" + ex.Message);
            }
            catch (System.Exception ex)
            {
                Console.WriteLine("catch2_" + ex.Message);
            }
            Console.ReadLine();
        }
    }
}

上述语句执行之后,“i = Int32.Parse(str);”语句执行时发生异常,第一个catch块会捕获该异常,并显示“输入字符串的格式不正确”信息。

注意:在上述程序代码中,如果第一个catch块没有捕获“i = Int32.Parse(str);”语句执行时的异常,那么第二个catch块将尝试捕获该语句执行时的异常。

使用try语句获取arr数组(元素类型为int)的索引值为20的元素的值,结果保存为r变量。该try语句包含一个try块、一个catch块和一个finally块。

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = new int[15];
            try
            {
                int i = arr[20];   // arr数组中的第20个元素
            }
            catch (System.Exception ex)
            {
                Console.WriteLine(ex.Message); 
            }
            finally
            {
                Console.WriteLine("Length = " + arr.Length.ToString());
            }
            Console.ReadLine();
        }
    }
}

上述语句执行之后,“int r = arr[20];”语句执行时发生异常,catch块会捕获该异常,并显示“索引超出了数组界限”信息。

最后,finally块中的语句始终被执行,它显示arr数组的长度。

异常处理流程

如果没有异常处理机制,程序出现异常会导致应用程序终止。因此C#异常处理机制的存在是很有必要的。异常是由try语句处理的。当发生异常时,就寻找相关联的catch语句,如果到达调用堆栈顶部仍然没有找到处理该异常的catch块,则由默认的异常处理程序处理该异常,然后应用程序终止。

异常的基类System.Exception类

在C#中,使用类表示异常。System.Exception类表示在应用程序执行期间发生的错误,它是.NET Framework中所有异常的基类型。当系统或应用程序发生错误时,将通过引发包含错误信息的异常来报告错误。一旦异常发生后,将由该应用程序或默认异常处理程序(如System.Exception类)来处理异常。System.Exception类包含描述错误的可读文本。当异常发生时,应用程序的运行库(如.NET Framework)将产生消息(保存在Exception类的实例的Message属性中)通知用户错误的性质并提供解决该问题的操作建议。

Exception类包括以下两类异常。

从SystemException派生的预定义公共语言运行库异常类。

从ApplicationException派生的用户定义的应用程序异常类。

System.Exception类包含8个属性,如描述异常原因的Message属性、导致当前异常的Exception实例的InnerException属性等。

System.Exception类的常用属性及其说明如下:

属    性                                      描    述
Data                          用户定义的其他异常信息的“键/值”对的集合
HelpLink                  此当前异常相关的帮助文件的链接
HResult                    分配给特定异常的编码数值(HRESULT)
InnerException       导致当前异常的Exception实例
Message                  描述当前异常的消息,即发生异常发生的原因
Source                     导致错误的应用程序或对象的名称
StackTrace              当前异常发生时,堆栈上的帧的字符串表示形式
TargetSite               引发当前异常的方法

其中,Message和InnerException属性是System.Exception类的最常用的属性。Message属性是只读属性,它包含发生当前异常的原因,即描述异常的错误信息。通过这些信息,使得开发人员或用户能够更加清楚方便地了解发生异常的原因。InnerException属性也是一个只读属性,它表示导致当前异常的Exception实例。此时,它的值不为null。

System.Exception类包含3个方法,

如获取异常基对象(一个Exception对象)的GetBaseException()方法等。System.Exception类的常用方法及其说明如下:

方    法                                            描    述
GetBaseException()        获取异常的根Exception对象
GetObjectData()               获取与异常相关的SerializationInfo属性的值
GetType()                          获取当前实例的运行时类型

常用异常类

在项目开发中,程序会出现各种各样的异常,因此,.NET Framework提供了10个常用异常类,

如处理空(null)引用的System.NullReferenceException类、

处理数组索引小于0或超过其下标的System.IndexOutOf RangeException类等。

这些常用异常类及其说明如下:

类                                                                                                     描    述
System.ArithmeticException                              在算术运算期间发生错误时,引发该异常
System.ArrayTypeMismatchException             如果被存储的元素的实际类型与数组的元素类型不兼容,引发此异常
System.DivideByZeroException                        当除数为0时,引发该异常
System.IndexOutOfRangeException                 如果使用小于零或超出数组界限的下标访问数组,引发该异常
System.InvalidCastException                             如果显式转换失败,就会引发此异常
System.NullReferenceException                        如果使用null引用,引发此异常
System.OutOfMemoryException                        在通过new操作分配内存失败时,引发该异常
System.OverflowException                                 在checked上下文中的算术运算溢出时,引发该异常
System.StackOverflowException                       当堆栈溢出(如无限递归)时,引发该异常
System.TypeInitializationException                    静态构造函数引发异常,且没有可以捕捉到它的catch子句时,引发该异常

首先创建3个类型为int的变量i、j和checkedResult。i变量的值为32位最大整数,j变量的值为2,checkedResult变量保存i和j变量之和。然后在try…catch语句中、并使用checked运算符检查了i和j变量之和。由于i和j变量之和产生溢出,因此会引发OverflowException异常,并在catch语句中显示异常信息。

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = Int32.MaxValue;     // 32位最大值
            int j = 2;
            int checkedResult;
            Console.WriteLine("i = " + i.ToString());
            Console.WriteLine("j = " + j.ToString());
            try
            {
                checkedResult = checked(i + j);
                Console.WriteLine("checkedResult = " + checkedResult.ToString());
            }
            catch (System.OverflowException over)
            {
                Console.WriteLine(over.Message);
            }
            Console.ReadLine();
        }
    }
}

------- Windows Phone 7手机开发.Net培训、期待与您交流! ------- 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值