zoukankan      html  css  js  c++  java
  • C# 中异常抛出捕获机制--throw / try,catch,finally

    try
    {
       messagebox.show("true");
    }
    catch
    {
       messagebox.show("false");
    }
    finally
    {
       messagebox.show("finally");
    }
    class A 
    { 
    private void aa() 
    { 
    B bb =new B(); 
    try//这里调用了B的bb方法,并且捕获了bb抛出的异常同时进行了处理 
    { 
    bb.bb(); 
    } 
    catch(Exception e) 
    { 
    messagebox.show("Class B Error:"+e);//这里处理了bb的异常信息 
    } 
    } 
    } 
    
    class B 
    { 
    int i = 0; 
    public void bb() 
    { 
    if(this.i != 0) //随便做了个假设
    { 
    throw new Exception("电脑故障了,i不可能大于0."); 
    } 
    } 
    } 

    notes:

         抛出异常用 throw new exception,捕获异常用 try..catch..finally

    • try ... catch 的目的是解决程序在出现错误时无法继续执行下去的问题。
    • throw就是用来抛出异常的,
      现在是:一个方法 B.bb()中,使用throw语句抛出了一个异常,则调用了 bb方法的地方(A中的aa方法中),必须进行捕捉,或者继续抛出,一直到 main方法,如果main方法也没有进行捕捉,系统则崩溃。
      总之,系统碰到没有捕捉的异常,立刻停止,你的弹出对话框的语句,在throw语句的后面,throw语句一执行,调用 A 方法的地方,立刻捕捉到了这个异常,并进行处理,throw后面的语句并没有执行。
    • 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是个类, 申明一个ex的Eeception对象,这个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的作用是当代码执行到此处时认为的让程序出错,出错原因是你指定的内容
      catch的作用是try包含的内容运行出错时,catch扑捉到try里面出错的原因,至于对于这个错误你怎么操作就放在catch里,你可以把错误写日志,messagebox输出等等

    =========================================================================

    • try
      catch
      finally
      1、将预见可能引发异常的代码包含在try语句块中。
      2、如果发生了异常,则转入catch的执行。catch有几种写法:
      catch
      这将捕获任何发生的异常。
      catch(Exception e)
      这将捕获任何发生的异常。另外,还提供e参数,你可以在处理异常时使用e参数来获得有关异常的信息。
      catch(Exception的派生类 e)
      这将捕获派生类定义的异常,例如,我想捕获一个无效操作的异常,可以如下写:
      catch(InvalidOperationException e)
      {
          ....
      }
      这样,如果try语句块中抛出的异常是InvalidOperationException,将转入该处执行,其他异常不处理。
      --------------------------------------------------------------------------------------------------------------------------
      catch可以有多个,也可以没有,每个catch可以处理一个特定的异常。.net按照你catch的顺序查找异常处理块,如果找到,则进行处理,如果找不到,则向上一层次抛出。如果没有上一层次,则向用户抛出,此时,如果你在调试,程序将中断运行,如果是部署的程序,将会中止。
      如果没有catch块,异常总是向上层(如果有)抛出,或者中断程序运行。

      3、finally
      finally可以没有,也可以只有一个。无论有没有发生异常,它总会在这个异常处理结构的最后运行。即使你在try块内用return返回了,在返回前,finally总是要执行,这以便让你有机会能够在异常处理最后做一些清理工作。如关闭数据库连接等等。
      注意:如果没有catch语句块,那么finally块就是必须的。

      如果你不希望在这里处理异常,而当异常发生时提交到上层处理,但在这个地方无论发生异常,都要必须要执行一些操作,就可以使用try finally,
      很典型的应用就是进行数据库操作:
      用下面这个原语来说明:
      try
      {
          DataConnection.Open();
          DataCommand.ExecuteReader();
          ...
          return;
      }
      finally
      {
          DataConnection.Close();
      }

      无论是否抛出异常,也无论从什么地方return返回,finally语句块总是会执行,这样你有机会调用Close来关闭数据库连接(即使未打开或打开失败,关闭操作永远是可以执行的),以便于释放已经产生的连接,释放资源。

      顺便说明,return是可以放在try语句块中的。但不管在什么时机返回,在返回前,finally将会执行。


    小结
    try { //执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 }

    catch { //除非try里面执行代码发生了异常,否则这里的代码不会执行 }

    finally { //不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally }

    注意:

    catch{}花括号内部的代码执行完后,还是会继续执行下面的代码,如果要终止程序的运行,用return:

    try{

    }catch(Exception mye){
    return;
    }
    这么写就可以了!

    catch{throw} 向上泡出,这样子也是不会执行的!

  • 相关阅读:
    [LeetCode] Power of Three 判断3的次方数
    [LeetCode] 322. Coin Change 硬币找零
    [LeetCode] 321. Create Maximum Number 创建最大数
    ITK 3.20.1 VS2010 Configuration 配置
    VTK 5.10.1 VS2010 Configuration 配置
    FLTK 1.3.3 MinGW 4.9.1 Configuration 配置
    FLTK 1.1.10 VS2010 Configuration 配置
    Inheritance, Association, Aggregation, and Composition 类的继承,关联,聚合和组合的区别
    [LeetCode] Bulb Switcher 灯泡开关
    [LeetCode] Maximum Product of Word Lengths 单词长度的最大积
  • 原文地址:https://www.cnblogs.com/ammy714926/p/4397861.html
Copyright © 2011-2022 走看看