第三章 异常处理和类
一、异常处理语句
1.什么是异常:在程序运行期间发生的错误或意外(异常是一种错误条件,当代码路径的正常控制流程不符合实际或是不正确时,异常就会发生)。
2.Visual C#语言的异常处理方法:在程序中加入异常控制代码,提供更为明确的处理结果
3.异常处理语句的使用
(1)格式1:try-catch语句 
try语句块中包含可能产生异常的代码,catch中指定对异常的处理
class trycatchstatement
    {
        public void test()
        {
           
            try
            {
                int b = int.Parse("abc");
            }
            catch (FormatException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
(2)格式2:try-finally语句
try语句块包含可能产生异常的代码 finally中指定最终都要执行的子语句
class trycatchstatement
    {
        public void test()
        {
            try
            {
                int b = int.Parse("abc");
            }           
            finally
            {
                Console.WriteLine("执行结束");
            }
        }
    }
与格式1比较,程序不提供对异常的处理,只保证finally语句块中的代码一定被执行
(3)格式3:try-catch-finally(常用格式)
try语句块中包含可能产生异常的代码,catch中指定对异常的处理,finally中指定最终都要执行的子语句,放在所有catch后,只能出现一次
class trycatchstatement
    {
        public void test()
        {
            try
            {
                int b = int.Parse("abc");
            }
            catch (FormatException ex)
            {
                Console.WriteLine(ex.Message);
            }
           
finally
            {
                Console.WriteLine("执行结束");
            }
        }
    }
(4)throw语句
throw语句可以重新引发一个已捕获的异常,还可以引发一个预定义的或自定义的异常,可被外围的try语句接收,throw引发的异常称为显示引发异常
class trycatchstatement
    {
        public void test()
        {
            try
            {
                int b = int.Parse("abc");
                string str = null;
                if (str = null)
                {
                    ArgumentException ex = new ArgumentNullException();
                    throw ex;
                }
            }
            catch (ArgumentException ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                Console.WriteLine("执行结束");
            }
        }
    }
(5)关于异常的特定程度高低
当try语句中有多个异常抛出时,catch语句也必须有多个,与异常相对应。则多个catch语句的顺序对异常的处理有影响。因为程序是按照顺序检查catch语句,将先捕获特定程度较高的异常。所谓异常的特定程度,与C#中异常类的层次结构(继承关系)有关。
同时使用多个catch语句时,如果其中有两个catch语句所捕获的异常类存在继承关系,那么要保证捕获派生类的catch语句在前,而捕获基类的catch语句在后。否则,捕获派生异常类的catch语句不会起任何作用或者系统报错。
.NET中异常类直接的派生关系如下图所示
Exception是所有异常类的父类
SystemException:是System命名空间中所有其他异常类的基类
IOException:该类用于处理进行文件输入输出操作时所引发的异常
ApplicationException:该类表示应用程序发生非致命错误时所引发的异常,自定义异常派生自该类
Exception特定程度高低代码范例
public void test()
        {
            try
            {
                int b = int.Parse("abc");
                string str = null;
                if (str == null)
                {
                    ArgumentException ex = new ArgumentNullException();
                    throw ex;
                }
            }
            //如果把第三个catch移置第一,观察结果有何变化
            catch (ArgumentException ex)
            {
                Console.WriteLine("ArgumentException " + ex.Message);
            }
            catch (FormatException ex)
            {
                Console.WriteLine("FormatException " + ex.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception " + ex.Message);
            }
            finally
            {
                Console.WriteLine("执行结束");
            }
        }
(6)Exception常见属性与方法
属性名
功能
Data
这个属性可以给异常添加键/值语句,以提供异常的额外信息。
HelpLink
链接到一个帮助文件上,以提供该异常的更多信息
InnerException
如果此异常是在catch块中抛出的,它就会包含把代码发送到catch块中的异常对象
Source
导致异常的应用程序或对象名
StackTrace
堆栈上方法调用的信息,它有助于跟踪抛出异常的方法
TargetSite
描述抛出异常的方法的.NET反射对象
Message
描述错误情况的文本
二、预定义异常处理
C#已经预定义了一些异常,使用时只需要定义该中异常类型即可,以常见的除法运算,除数不为零为例。
public void run()
        {
          //goon:
            try
            {
                Console.WriteLine("请输入被除数!");
                int num1 = int.Parse(Console.ReadLine());
                writeline方法属于类Console.WriteLine("请输入除数!");
                int num2 = int.Parse(Console.ReadLine());
                int resutl = num1 / num2;
                Console.WriteLine("运算结果是{0}", resutl);
            }
            catch (DivideByZeroException ex)
            {
                Console.WriteLine(ex.Message);
            //goto goon;
            }
            finally
            {
                Console.WriteLine("运行结束了!");
            }
        }
三、自定义异常
除了可以使用系统预定义的异常以为,还可以根据需要自己定义异常。由Exception或者Exception类的子类派生。
步骤:
1.自定义异常类,继承自某个异常
2.重写构造函数和属性(Message属性),或者声明方法
3.在可能出现问题的地方调用
class ageexception : Exception
    {
        string _message;
        //获得父类的错误信息内容
        public ageexception()
        {
            _message = base.Message;
        }
        public ageexception(string strmessage)
        {
            _message = strmessage;
        }
        //重写message属性
        public override string Message
        {
            get
            {
                return _message ;
            }
        }
        //或者定义方法输出异常信息
        public void pm()
        {
            Console.WriteLine(_message);
        }
    }
try
            {
              Console .WriteLine ("请输入年龄");
                int age=int.Parse(Console .ReadLine());
                if (age>20 || age< 10)
                {
                    string message = "你输入的年纪不符合要求!";
                    ageexception a=new ageexception (message );
                    throw a;
                }
            }
            catch (ageexception a)
            {
                Console.WriteLine(a.Message);
            }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。