博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

所谓自定义异常是指我们继承c#中的异常类,如果希望用户能以编程方式区分一些错误条件,您可以创建自己的用户定义的异常。.NET Framework 提供根本上从基类 Exception 派生的异常类的层次结构。这些类中的每一个都定义一个特定的异常,因此在很多情况下只需捕捉该异常。您也可以通过从 Exception 类派生来创建自己的异常类。

创建自己的异常时,好的编码做法是以“Exception”这个词作为用户定义的异常类名的结尾。

小提示:关于类和构造函数的知识请参看下一章,而对于本节的内容,您也可以在下一章学完后再回头来学习。

下面我们做一个实例,从定义自定义异常一直到捕获和处理:

1.         创建名为“自定义异常”的Windows桌面应用程序项目;

2.         在解决方案资源管理器中的项目名称上点击右键,添加一名为“MydefineException.cs”的类。

3.         整个类的代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace自定义异常

{

    //在这句前面加上修饰符public,并使该类继承自Exception

    public class MydefineException : Exception

    {

        private string message;// 用作错误消息的私有变量

 

        //添加两个构造函数

        public MydefineException()

        {

            message = "我高兴说你错误,你就错误!"; //为变量message赋值

        }

        public MydefineException(string msg)

            : base(msg)//参考本书后面章节的构造函数重载

        {

            message = msg;  //将传入参数msg的值赋给变量message

        }

        ///<summary>

        ///重写异常错误信息

        ///</summary>

        ///<returns>错误消息</returns>

        public override string ToString()

        {

            return message;

        }

    }

}

 

 

4.          在项目中添加名为“UserException.cs”的Windows窗体;在界面上还是一个TextBox一个Button就行了。

5.          双击Button,在事件编写代码,如下:

        private void button1_Click(object sender, EventArgs e)

        {

            try

            {

                string txt = textBox1.Text;

                if (txt == "")

                {// 如果为空的话,就提示我们自定义的错误

                    throw new MydefineException("我说你错,你就错了");

                    //因为MydefineException类有两个构造函数,所以可以再试试下面这种

                    //throw new MydefineException();

                }

                int i = int.Parse(txt);

                button1.Text = "转换结果为: " + i.ToString();

            }

            catch (MydefineException mex)

            {

                MessageBox.Show(mex.Message);

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

6.         运行以看结果。

 

老田:好了,关于异常处理再最后说一点。只有在哪些可能出错,而代码又无法明确干涉的地方才用异常。前面讲到,因为异常本身还是比较耗费系统效率的。但凡可以预知并处理的错误,还是不要滥用try…catch…finally

 

本章小结

本章学习了异常处理的基本的方法——try-catch-finally

使用一个 Try/Catch 块可以向代码段添加异常处理。使用一个try,我们可以使用多个catch语句来执行。.NET 运行时可以依次处理 catch 块,它将使用找到的第一个匹配块。因此在使用的时候,我们要将子类的catch块放在程序的前端。您可以嵌套 Try 块,以便轻松而有效地推入和弹出异常处理状态。 Try 块后添加一个 Finally 块,这样无论发生什么,都可以无条件运行代码。

在本章,您学习到:

1. 异常是程序运行中发生的错误。系统异常派生出两大类:

·           一种是系统内建的异常,这些都是系统定义的异常,被称为系统程序异常。

·           一种是用户自己定义的异常,被称为应用程序异常。

2. 异常的产生是通过throwing一个该异常的对象实现的,异常的捕获是通过catch该异常的对象。

3. 可以使用多个catch来捕获异常

4. 异常处理的流程

5. 关键字

·           try

·           catch

·           throwing

·           finally

·           return

6. 用户自定义异常

 

异常及其处理具有以下特点:

·         在应用程序遇到异常情况(如被零除情况或内存不足警告)时,就会产生异常。

·         在可能引发异常的语句周围使用 try 块。

·         try 块中发生异常后,控制流会立即跳转到关联的异常处理程序(如果存在)。

·         如果给定异常没有异常处理程序,则程序将停止执行,并显示一条错误消息。

·         如果 catch 块定义了一个异常变量,则可以使用它来获取有关所发生异常的类型的更多信息。

·         可能导致异常的操作通过 try 关键字来执行。

·         异常处理程序是在异常发生时执行的代码块。在 C# 中,catch 关键字用于定义异常处理程序。

·         程序可以使用 throw 关键字显式地引发异常。

·         异常对象包含有关错误的详细信息,比如调用堆栈的状态以及有关错误的文本说明。

·         即使引发了异常,finally 块中的代码也会执行,从而使程序可以释放资源。

 

问题:

1.       说出五条以上你认为最重要的提高代码可读性的规范来。

2.       VS中是否可以打N个断点,如果可以,那么打N个断点有什么用?

3.       VS中遇到断点后直接按F5键有什么后果?

4.       是否可以一次清除所有断点?那个菜单的那个项?

5.       try…catch…是否可以嵌套?如果可以请做出示例。

6.       catch语句块中,是否可以用比如goto等跳转关键字替换return

7.       如果在catch语句块中执行了return,请问Finally语句块中的代码还能够得到执行吗?

8.       你认为try…catch…语句最主要应该用在哪些地方?
本文章为天轰穿原创文章,转载请注明出处及作者。