• C#高级编程八十一天----捕获异常


    捕获异常

    前面主要说了关于异常的一些基础和理论知识,没有进入到正真的异常案例,这一讲通过几个案例来描写叙述一下异常的捕获和处理.

    案例代码:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    namespace 异常处理

    {

        class Program

        {

            int result;

            Program()

            {

                result = 0;

            }

            public void DisPlay(int a, int b)

            {

                try//这个话可能有问题

                {

                    result = a / b;

                }

                catch (DivideByZeroException e) //不知道这个异常代表什么自己去查,有过那句话真的有问题,我就得治它

                {

                    Console.WriteLine("Exception caught: {0}", e);

                }

                finally//无论怎样,以下这句话我必须得输出

                {

                    Console.WriteLine("Result: {0}", result);

                }

            }

            static void Main(string[] args)

            {

                Program p = new Program();

                p.DisPlay(25, 0);

                Console.ReadKey();

            }

        }

    }

    别和我说你看不懂,唯一看不懂得地方就是哪一点try-catch语句的地方,我都凝视好了(你试试没有try-catch语句会咋样?===>假设没有try,程序会终止)

    简单说点其它小内容:

    try ... catch 的目的是解决程序在出现错误时无法继续运行下去的问题。

    try不一定仅仅能和catch 配对,也能够try{}finally{}这种形式,这不是没有意义,由于这样能够保证即使发生了异常,finally里面的代码一定会被运行。有时候,这个还是很实用的。

     比方能够用来释放一些自己占用的资源。然后让调用者处理异常。

    对异常的捕获由三个部分组成:

    try { //运行的代码,当中可能有异常。

    一旦发现异常。则马上跳到catch运行。否则不会运行catch里面的内容 } catch { //除非try里面运行代码发生了异常,否则这里的代码不会运行 } finally { //无论什么情况都会运行,包含try catch 里面用了return ,能够理解为仅仅要运行了try或者catch,就一定会运行 finally }

    Try语句

    Catch语句

    Finally语句

    try -- 意思是 “试一试” 
    catch --  意思是 “抓”,抓一抓。 
    没有错,就抓不到错。有错才干抓到并处理。

    一个try能够跟随意个catch(个数没有限制)。主要是看有多少个异常类型。包括自己定义的,Eeception是个类, 申明一个exEeception对象,这个ex里面包括了当前发生在捕捉到的try块的全部异常信息,ex.Message最经常使用的 (try块的具体异常信息),

    ex的位置:仅仅能在cath块 (异常处理块)
    ex的作用:保存着系统捕获的异常;
    为什么要用ex:  由于你不是神。并不能预測到你的程序会出什么错。所以就用
     MessageBox.Show(ex.Message);让系统提示你程序错在哪里,就能够顺藤摸瓜,逮到错误源从而解决他!

    假设catch语句捕获了try语句不可能抛出的异常时,代码将不能通过,假设catch语句中使用例如以下方式:catch( Exception  e ){ }将在不论什么情况下。编译都能通过。

    try{    DataConnection.Open();    DataCommand.ExecuteReader();    ...    return;}finally{    DataConnection.Close();}


    不管是否抛出异常,也不管在catch 中从什么地方return返回,finally语句块总是会运行,这样你有机会调用Close来关闭数据库连接(即使未打开或打开失败。关闭操作永远是能够运行的),以便于释放已经产生的连接,释放资源。
    另外说明。return是能够放在try语句块中的。但无论在什么时机返回,在返回前,finally将会运行。

    throw(不止throws)的作用是当代码运行到此处时觉得的让程序出错。出错原因是你指定的内容
    catch的作用是try包括的内容执行出错时,catch扑捉到try里面出错的原因,至于对于这个错误你怎么操作就放在catch里,你能够把错误写日志,messagebox输出等等

    备注:throw是语句,抛出一个异常 ; throws是方法抛出一个异常;

    throw语法: throw <异常对象>

    (C#中是没有throws,JAVA里有!别搞错了)throws语法 : [修饰符] <返回值类型> <方法名>([參数列表]) [throws <异常类>]

    当中:异常类能够声明多个,用逗号分隔.

    上面的那个案例,你试试经catch语句里的内容换成下面内容?

    throw e;(应该会程序终止)

    也能够换成这样:

    throw new Exception("出错啦。", e);//这个时候也会终止程序,你注意看终止信息!!!

    注意在捕获并抛出异常时应使用 throw new Exception("出错啦!", ex); 方式,则可获得异常的详细位置。

    当在VS调试或者DEBUG模式下执行程序成都可获得异常发生的详细位置。

    但当在独立执行的RELEASE模式下时,异常仅仅会记录最初的调用位置。

    当运行文件夹不包括 *.pdb 文件时,异常信息中不会包括代码及行号信息。

    最后以一个案例结束异常捕获的部分:

        class Program

        {

            static void Main(string[] args)

            {

                string userInput;

                while (true)

                {

                    try

                    {

                        Console.WriteLine("请输入05之间的随意一个数字: ");

                        userInput = Console.ReadLine();

                        if (userInput == "")

                        {

                            //当用户输入"",跳出trywhile可是仍然运行finally

                            break;

                        }

                        int index = Convert.ToInt32(userInput);

                        if (index < 0 || index > 5)

                        {

                            //抛出异常

                            //可使用System.Exception,可是该类是个基本类,,没有包括特定错误信息

                            //此处可用派生类IndexOutRangeException

                            throw new IndexOutOfRangeException("请你看看要求好不好,你输入的是: " + userInput);

                        }

                        Console.WriteLine("你输入了:" + index);

                    }

                    //传递给catch块的參数仅仅能用于该catch,因此兴许catch块仍然可用同名參数ex

                    catch (IndexOutOfRangeException ex)

                    {

                        Console.WriteLine("异常了: " + ex.Message);

                    }

                    /*

                     * 假设没有前面catch块中捕获的异常类,这个也能处理IndexOutOfRangeException

                     * 计算机仅仅运行它在catchh块列表中找到的第一个合适的catch

                     * 基类的一个引用可一直想派生于他的全部类实例

                     * 因此,最上面的catch块应用于最特殊的异常情况,最后的是一般的catch

                     * 

                     */

                    catch (Exception ex)

                    {

                        Console.WriteLine("抛出异常: " + ex.Message);

                    }

                    /*

                     * 最一般的catch(不带參数),用于处理其它没用C#编写的代码抛出的异常

                     * C#中仅仅有派生于System.Exception类的实例才干作为一场抛出,其它语言没这个限制

                     * catch块相同捕获所有异常,仅仅是不知异常的具体信息

                     */

                    catch

                    {

                        //由于我们不知道这个异常表示什么类

                        Console.WriteLine("不知道什么异常,你自己猜去把.");

                    }

                    //不管运行try,catch最后都运行finally

                    finally

                    {

                        Console.WriteLine("无论咋样,我都得运行,哥就是牛X");

                    }

                    /* 没有处理异常时发生的情况 

                    * 生成一个异常后,代码中没有catch块能处理这异常。由.NET执行库捕获 

                    * .NET执行库把整个程序放在还有一个更大的try块中,用一个catch处理捕获全部异常 

                    */

                }

            }

    }

    注意:一般编写一个可运行程序,硬不货异常,编写一个库,最好不要补货,要家丁调用代码能够处理.

  • 相关阅读:
    Zookeeper的ZAB协议
    Netty从入门到放弃,从放弃在到入门
    Java多线程-锁的原理
    ContextLoaderListener的说明
    Jdk和Cglib 的区别
    zookeeper核心概念
    https
    [CS Academy] Infinity Array
    [JZOJ 5669] Permutaition
    [CF 613 Div.1E] Puzzle Lover
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7225146.html
Copyright © 2020-2023  润新知