C# 异常处理

首先参考MSDN:try-catch(C# 参考)http://msdn.microsoft.com/zh-cn/library/0yd65esw(VS.80).aspx

 

    一个性能良好且稳健的程序应该允许异常情况发生、避免终止运行,这就要求编程人员能够预知可能发生的特情况,并且在程序编码处理这些特殊情况,我们称这个过程叫“异常处理”或“错误处理”。
    如下列代码在执行过程会出现“算术除0”这样的异常:
         INPUT Divisor
         IF Divisor = 0 THEN
         Result = Divident/Divisor
         ....
         System.Exception
    .NET Framework提供了很多处理异常的类,如图5所示:

 

图5 Exception类的层次结构

 

SystemException 其他用户可处理的异常的基本类 
ArgumentException 方法的参数是非法的 
ArgumentNullException 一个空参数传递给方法,该方法不能接受该参数 
ArgumentOutOfRangeException 参数值超出范围 
ArithmeticException 出现算术上溢或者下溢 
ArrayTypeMismatchException 试图在数组中存储错误类型的对象 
BadImageFormatException 图形的格式错误 
DivideByZeroException 除零异常 
DllNotFoundException 找不到引用的DLL 
FormatException 参数格式错误 
IndexOutOfRangeException 数组索引超出范围 
InvalidCastException 使用无效的类 
InvalidOperationException 方法的调用时间错误 
MethodAccessException 试图访问思友或者受保护的方法 
MissingMemberException 访问一个无效版本的DLL 
NotFiniteNumberException 对象不是一个有效的成员 
NotSupportedException 调用的方法在类中没有实现 
NullReferenceException 试图使用一个未分配的引用 
OutOfMemoryException 内存空间不够 
PlatformNotSupportedException 平台不支持某个特定属性时抛出该错误 
StackOverflowException 堆栈溢出

 

Exception:所有异常对象的基类。
SystemException:运行时产生的所有错误的基类。
IndexOutOfRangeException:当一个数组的下标超出范围时运行时引发。
NullReferenceException:当一个空对象被引用时运行时引发。
InvalidOperationException:当对方法的调用对对象的当前状态无效时,由某些方法引发。 

ArgumentException:所有参数异常的基类。
ArgumentNullException:在参数为空(不允许)的情况下,由方法引发。
ArgumentOutOfRangeException:当参数不在一个给定范围之内时,由方法引发。
InteropException:目标在或发生在CLR外面环境中的异常的基类。
ComException:包含COM类的HRESULT信息的异常。
SEHException:封装Win32结构异常处理信息的异常。
SqlException:封装了SQL操作异常

l Exception类的属性
 n Message:描述错误信息
 n Source:显示异常发生时的应用程序或对象名
 n StackTrace:显示异常发生时的堆栈信息
 n InnerException:对内部异常的引用
l 引发异常的方式
 n 使用显式 throw 语句来引发异常。在此情况下,控制权将无条件转到处理异常的部分代码
 n 使用语句或表达式在执行过程中激发了某个异常的条件,使得操作无法正常结束,从而引发异常
l try和catch块
 n 格式:
            try
            {
               //可能发生异常的程序代码
            }
            catch (异常对象1)
            {
               //错误处理程序
            }
            catch(异常对象2)
            {
               //错误处理程序
            }
            finally
            {
              //不管异常有无发生都要执行的代码
            }
 n 执行流程如图6所示

 

图6 执行流程

 n 示例1:
           try
           {
                //程序代码
            }
            catch(System.Exception E)//可以处理各种异常
            {
               //错误处理代码
            }
 n 示例2:
           try
           {
               //程序代码
           }
           catch (IOException E) //捕捉IO异常
           {
               //错误处理代码
           }
l 使用throw引发异常
   使用throw可以引发系统异常,也可以引发自定义异常,格式如下列代码所示:
         if (UserInput < 1 && UserInput > 100)
         {
             throw new InvalidNumberInput(UserInput + “不是有效输入(请输入 1 和 100 之间的数字)”);
         }
l 自定义异常
   写一个类,这个类必须直接或间接继承System.ApplicationException类。
  n 示例
    Ø 定义一个异常类:
                using System;
                public class EmailErrorException:ApplicationException
                {
                   public string _message;
                    //重写构造函数
                   public EmailErrorException():base()
                   {
                      _message = null;
                   }
                   public EmailErrorException(string message):base()
                   {
                      _message = message.ToString();
                   }
                   public EmailErrorException(string message,
                   Exception myNew):base(message,myNew)
                   {
                      _message = message.ToString();
                   } 
                     //Message属性的重载
                   public override string Message
                   {
                      get
                      {
                        return "Email格式错误。";
                      }
                    }
                }
    Ø 用throw引发自定义异常
                 private bool SaveInfo(string name, string email)
                 {
                    string[] subStrings = email.Split('@');
                    //如果输入的Email不是被“@”字符分割成两段,则抛出Email错误异常
                    if(subStrings.Length != 2) 
                    {  
                       throw new EmailErrorException();
                    }
                    else
                    {
                       int index = subStrings[1].IndexOf(".");
                        //查找被“@”字符分成的两段的后一段中“.”字符的位置,没有“.”                         
                        //或者“.”字符是第一个字符,则抛出EmailErrorException异常
                       if(index <= 0)
                       {
                          throw new EmailErrorException();
                       }
                        //如果“.”字符是最后一个字符,抛出EmailErrorException异常
                       if(subStrings[1][subStrings[1].Length -1] == '.')
                       {
                          throw new EmailErrorException();
                       }
                    }
                       return true;
                 }
    Ø Catch自定义异常
                private void btnSubmit_Click(object sender, System.EventArgs e)
                {
                   if(txtName.Text.Length == 0 && txtEmail.Text.Length == 0)
                   {
                      MessageBox.Show("请填写姓名和Email。", "填写不完整"
                      , MessageBoxButtons.OK
                      , MessageBoxIcon.Information);
                      return;
                    }
                    try
                    {
                       SaveInfo(txtName.Text, txtEmail.Text);
                    }
                    catch(EmailErrorException ex)
                    {
                       MessageBox.Show(ex.Message, "Email 格式错误"
                       , System.Windows.Forms.MessageBoxButtons.OK
                       , MessageBoxIcon.Information);
                       return;
                    }
                      MessageBox.Show("保存成功。", "成功"
                      , MessageBoxButtons.OK
                      , MessageBoxIcon.Information);
                }

小结

  u 调试是搜寻和消除应用程序中的错误的过程
    u 语法错误表示编译器无法理解代码
    u 调试模式可用来重复编译和排除应用程序中的错误,直至能够成功运行
    u“局部变量”窗口允许用户监控当前程序中所有变量的值
    u 单元测试和集成测试是测试大型应用程序的常用技术
    u 当应用程序遇到运行时错误时,就会引发异常
    u C# 中的所有异常都派生自 Exception 类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值