• 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} 向上泡出,这样子也是不会执行的!

  • 相关阅读:
    Oracle关于快速缓存区应用原理
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.RequestContext
    速记const 指针与指向const的指针
    bzoj3992【SDOI2015】序列统计
    ubuntu 1204 安装mysql
    解决getOutputStream() has already been called for this response
    把一个project相关的jar放到project的lib文件夹中
    解决eclipse偶尔无视breakpoint的行为
    解决eclipse无法打开:Failed to load the JNI shared library
    挣值管理公式集合
  • 原文地址:https://www.cnblogs.com/ammy714926/p/4397861.html
Copyright © 2020-2023  润新知