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

原文地址:https://www.cnblogs.com/ammy714926/p/4397861.html