C# 中异常抛出捕获机制--throw / try,catch,finally

try
{
   messagebox.show("true");
}
catch
{
   messagebox.show("false");
}
finally
{
   messagebox.show("finally");
}

notes:

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

  • 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是个类, 申明一个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 }

时间: 2024-08-29 14:33:41

C# 中异常抛出捕获机制--throw / try,catch,finally的相关文章

java的异常抛出throws和throw的简单使用

前提: 当在程序测试时,如果你需要定义一个自己的异常,而非现在已经存在的异常,这个时候你需要用到throws和throw,try-catch只是一个简单的捕获异常的过程. 代码如下: package org.axc.com.Action; import java.lang.Exception; public class TestException { public static void count(int x) throws MyException{ if(x>0) { throw new M

异常抛出与捕获的思考

异常处理的思考 在java中异常分为两类.一.检查性异常.二.非检查性异常(运行时异常) 二者的区别:检查性异常需要显式try-catch或者throw.运行时异常可以不用捕获. 对于检查性异常由于必须捕获,所有并不需要太多的讨论(在设计异常的时候需要考虑).主要讨论运行时异常的抛出与捕获. 运行时异常的正确捕获和抛出,能够让系统代码更加简洁与rd只需要关系正常业务,对于不正常业务则交由异常处理. 现在存在的困扰: 1.每调用一个其他方法,都需要考虑与分析这个方法是不是存在异常,影响正常业务流程

Python之异常抛出机制

异常抛出机制 : 常见的Python异常:

C++中异常规格(异常抛出表)和 成员初始化表 的放置先后顺序

测试代码如下 #include <iostream> #include <cstdio> class CPoint{ public: CPoint(int x){ printf("has synax\n"); } CPoint(){ printf("no synax\n"); } }; class Point : public CPoint{ public: Point()throw() :CPoint(1){ } }; Point p; i

(转)spring异常抛出触发事务回滚策略

背景:在面试时候问到事务方法在调用过程中出现异常,是否会传递的问题,平时接触的比较少,有些懵逼. spring异常抛出触发事务回滚策略 Spring.EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚 测试用业务逻辑方法: /** * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*)配置事务在什么情况下回滚(格式:-引起回滚的异常类型) * 则spring默认只会在service方法抛出unchecked exceptio

PLSQL_Oracle Exception异常分类、异常抛出、异常处理、异常传播(概念)

2014-06-03 BaoXinjian 一.摘要 在PLSQL程序开发过程中,很重要的部分就是对程序异常的监控和处理,包括如何触发异常,何时进行处理,如何进行处理,是否将程式中的所有异常集中在一起,通过公共异常处理的procedure或function,如果没有完善的程式处理机制,很难说该程式是一只健壮的程式,当程式遇到很多类型或者量很多资料时,系统若没有异常处理必然会导致程式的出错 当预判到了某些异常,需要对预判到的异常进行合适相应的处理,是否抛出异常还是忽略还是其他 当然程式没有预判到或

出错的方法有可能是JDK,也可能是程序员写的程序,无论谁写的,抛出一定用throw

应对未检查异常就是养成良好的检查习惯. 已检查异常是不可避免的,对于已检查异常必须实现定义好应对的方法. 已检查异常肯定跨越出了虚拟机的范围.(比如"未找到文件") 如何处理已检查异常(对于所有的已检查异常都要进行处理): 首先了解异常形成的机制: 当一个方法中有一条语句出现了异常,它就会throw(抛出)一个例外对象,然后后面的语句不会执行返回上一级方法,其上一级方法接受到了例外对象之后,有可能对这个异常进行处理,也可能将这个异常转到它的上一级. 对于接收到的已检查异常有两种处理方式

swif-throws异常抛出

import UIKit enum VendingMachineError: Error { case invalidSelection //选择无效 case insufficientFunds(coinsNeeded: Int) //金额不足 case outOfStock //缺货 } struct Item { var price: Int var count: Int } class VendingMachine { var inventory = [ "Candy Bar"

AspectJ的注解开发AOP:异常抛出通知的学习

异常抛出通知使用@AfterThrowing 在切面类中配置: import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import java.math.BigInteger; @Aspect public class aspectj { // @Before(value = "execution(* com.AspecJ.xiaomaoDao.*(..))") // publ