精华内容
下载资源
问答
  • try catch里面try catch嵌套

    万次阅读 2018-05-18 13:26:54
    try catch里面try catch嵌套

    try catch里面try catch嵌套


    点击打开链接

    try 与catch的作用

    首先要清楚,如果没有try的话,出现异常会导致程序崩溃。
    而try则可以保证程序的正常运行下去,比如说: 
    try{
      int i = 1/0;
    }catch(Exception e){
        e.printStackTrace();
    }
      一个计算的话,如果除数为0,则会报错,如果没有try的话,程序直接崩溃。用try的话,则可以让程序运行下去,并且输出为什么出错!
    try的话,配合log4j使用会对程序的日后维护帮助很大。
      那么e.printStackTrace();是什么意思?
      当try语句中出现异常是时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace();。
    printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。(这是白话解释,比较容易理解)

    try{
    //代码区
    }catch(Exception e){
    //异常处理
    }
    代码区如果有错误,就会返回所写异常的处理。

    展开全文
  • try catch

    2013-08-17 11:25:51
    try{} catch(…){} 以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码: try{BYTE* pch ;pch = ( BYTE* )...

    try{} catch(…){}

    以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码:

    1. try
    2. {
    3. BYTEpch ;
    4. pch = ( BYTE)00001234 ;   //给予一个非法地址
    5. *pch = 6 ; //对非法地址赋值,会造成Access Violation 异常
    6. }
    7. catch(...)
    8. {
    9. AfxMessageBox( "catched" ) ;
    10. }

    这段代码在debug下没有问题,异常会被捕获,会弹出”catched”的消息框。 但在Release方式下如果选择了编译器代码优化选项,则VC编译器会去搜索try块中的代码, 如果没有找到throw代码, 他就会认为try catch结构是多余的, 给优化掉。 这样造成在Release模式下,上述代码中的异常不能被捕获,从而迫使程序弹出错误提示框退出。

    那么能否在release代码优化状态下捕获这个异常呢, 答案是有的。 就是__try, __except结构, 上述代码如果改成如下代码异常即可捕获。

    1. __try
    2. {
    3. BYTEpch ;
    4. pch = ( BYTE)00001234 ;   //给予一个非法地址
    5. *pch = 6 ; //对非法地址赋值,会造成Access Violation 异常
    6. }
    7. __except( EXCEPTION_EXECUTE_HANDLER )
    8. {
    9. AfxMessageBox( "catched" ) ;
    10. }

    但是用__try, __except块还有问题, 就是这个不是C++标准, 而是Windows平台特有的扩展。 而且如果在使用过程中涉及局部对象析构函数的调用,则会出现C2712 的编译错误。 那么还有没有别的办法呢?

    当然有, 就是仍然使用C++标准的try{}catch(..){}, 但在编译命令行中加入 /EHa 的参数。这样VC编译器不会把try catch模块给优化掉了。

    找到一篇比较好的英文文章谈这个问题: http://members.cox.net/doug_web/eh.htm

    用C++10 年多了 , 居然这么基础的问题都搞错, 真是汗颜。 要加紧学习啊, Stay Hungry, Stay Foolish!

    Written by oldmonk on 九月 11th, 2006 with 2 comments.
    Read more articles on IT.



    http://se.csai.cn/ExpertEyes/No138.htm
                                         C++中catch(…)如何使用 
    上一篇文章中详细讲了讲C++异常处理模型的trycatch使用语法,其中catch关键字是用来定义catch block的,它后面带一个参数,用来与异常对象的数据类型进行匹配。注意catch关键字只能定义一个参数,因此每个catch block只能是一种数据类型的异常对象的错误处理模块。如果要想使一个catch block能抓获多种数据类型的异常对象的话,怎么办?C++标准中定义了一种特殊的catch用法,那就是” catch(…)”。

    感性认识

    1、catch(…)到底是一个什么样的东东,先来个感性认识吧!看例子先:

    int main()
    {
    try
    {
    cout << "在 try block 中, 准备抛出一个异常." << endl;
    //这里抛出一个异常(其中异常对象的数据类型是int,值为1)
    throw 1;
    }
    //catch( int& value )
    //注意这里catch语句
    catch( …)
    {
    cout << "在 catch(…) block 中, 抛出的int类型的异常对象被处理" << endl;
    }
    }

      2、哈哈!int类型的异常被catch(…)抓获了,再来另一个例子:

    int main()
    {
    try
    {
    cout << "在 try block 中, 准备抛出一个异常." << endl;
    //这里抛出一个异常(其中异常对象的数据类型是double,值为0.5)
    throw 0.5;
    }
    //catch( double& value )
    //注意这里catch语句
    catch( …)
    {
    cout << "在 catch(…) block 中, double类型的异常对象也被处理" << endl;
    }
    }

       3、同样,double类型的异常对象也被catch(…)块抓获了。是的,catch(..)能匹配成功所有的数据类型的异常对象,包括C++语言提 供所有的原生数据类型的异常对象,如int、double,还有char*、int*这样的指针类型,另外还有数组类型的异常对象。同时也包括所有自定义 的抽象数据类型。例程如下:

    int main()
    {
    try
    {
    cout << "在 try block 中, 准备抛出一个异常." << endl;
    //这里抛出一个异常(其中异常对象的数据类型是char*)
    char* p=0;
    throw p;
    }
    //catch( char* value )
    //注意这里catch语句
    catch( …)
    {
    cout << "在 catch(…) block 中, char*类型的异常对象也被处理" << endl;
    }
    }


    int main()
    {
    try
    {
    cout << "在 try block 中, 准备抛出一个异常." << endl;
    //这里抛出一个异常(其中异常对象的数据类型是int[])
    int a[4];
    throw a;
    }
    //catch( int value[] )
    //注意这里catch语句
    catch( …)
    {
    cout << "在 catch(…) block 中, int[]类型的异常对象也被处理" << endl;
    }
    }

      4、对于抽象数据类型的异常对象。catch(…)同样有效,例程如下:

    class MyException
    {
    public:
    protected:
    int code;
    };

    int main()
    {
    try
    {
    cout << "在 try block 中, 准备抛出一个异常." << endl;
    //这里抛出一个异常(其中异常对象的数据类型是MyException)
    throw MyException();
    }
    //catch(MyException& value )
    //注意这里catch语句
    catch( …)
    {
    cout << "在catch(…) block中, MyException类型的异常对象被处理" << endl;
    }
    }
    对catch(…)有点迷糊?
    1、究竟对catch(…)有什么迷糊呢?还是看例子先吧!
    void main()
    {
    int* p = 0;

    try
    {
    // 注意:下面这条语句虽然不是throw语句,但它在执行时会导致系统
    // 出现一个存储保护错误的异常(access violation exception)
    *p = 13; // causes an access violation exception;
    }
    catch(...)
    {
    //catch(…)能抓获住上面的access violation exception异常吗?
    cout << "在catch(…) block中" << endl;
    }
    }

      请问上面的程序运行时会出现什么结果吗?catch(…)能抓获住系统中出现的access violation exception异常吗?朋友们!和我们的主人公阿愚一样,自己动手去测试一把!
    结果又如何呢?实际上它有两种不同的运行结果,在window2000系统下用VC来测试运行这个小程序时,发现程序能输出"在catch(…) block中"的语句在屏幕上,也即catch(…) 能成功抓获住系统中出现的access violation exception异常,很厉害吧!但如果这个同样的程序在linux下用gcc编译后运行时,程序将会出现崩溃,并在屏幕上输出”segment fault”的错误信息。

    主人公阿愚有点急了,也开始有点迷糊了,为什么?为什么?为什么同样一个程序在两种不同的系统上有不同的表现呢?其原因就是:对于这种由于硬件或操作 系统出现的系统异常(例如说被零除、内存存储控制异常、页错误等等)时,window2000系统有一个叫做结构化异常处理(Structured Exception Handling,SEH)的机制,这个东东太厉害了,它能和VC中的C++异常处理模型很好的结合上(实际上VC实现的C++异常处理模型很大程度上建 立在SEH机制之上的,或者说它是SEH的扩展,后面文章中会详细阐述并分析这个久富盛名的SEH,看看catch(…)是如何神奇接管住这种系统异常出 现后的程序控制流的,不过这都是后话)。而在linux系统下,系统异常是由信号处理编程方法来控制的(信号处理编程,signal processing progamming。在介绍unix和linux下如何编程的书籍中,都会有对信号处理编程详细的介绍,当然执著的主人公阿愚肯定对它也不会放过,会深 入到unix沿袭下来的信号处理编程内部的实现机制,并尝试完善改进它,使它也能够较好地和C++异常处理模型结合上)。

    那么C++标准中对于这种同一个程序有不同的运行结果有何解释呢?这里需要注意的是,window2000系统下catch(…)能捕获住系统异常, 这完全是它自己的扩展。在C++标准中并没有要求到这一点,它只规定catch(…)必须能捕获程序中所有通过throw语句抛出的异常。因此上面的这个 程序在linux系统下的运行结果也完全是符合C++标准的。虽然大家也必须承认window2000系统下对C++异常处理模型的这种扩展确实是一个很 不错的完善,极大得提高了程序的安全性。

    为什么要用catch(…)这个东东?

    程序员朋友们也许会说,这还有问吗?这篇文章的一开始不就讲到了吗?catch(…)能够捕获多种数据类型的异常对象,所以它提供给程序员一种对异常 对象更好的控制手段,使开发的软件系统有很好的可靠性。因此一个比较有经验的程序员通常会这样组织编写它的代码模块,如下:

    void Func()
    {
    try
    {
    // 这里的程序代码完成真正复杂的计算工作,这些代码在执行过程中
    // 有可能抛出DataType1、DataType2和DataType3类型的异常对象。
    }
    catch(DataType1& d1)
    {
    }
    catch(DataType2& d2)
    {
    }
    catch(DataType3& d3)
    {
    }
    // 注意上面try block中可能抛出的DataType1、DataType2和DataType3三
    // 种类型的异常对象在前面都已经有对应的catch block来处理。但为什么
    // 还要在最后再定义一个catch(…) block呢?这就是为了有更好的安全性和
    // 可靠性,避免上面的try block抛出了其它未考虑到的异常对象时导致的程
    // 序出现意外崩溃的严重后果,而且这在用VC开发的系统上更特别有效,因
    // 为catch(…)能捕获系统出现的异常,而系统异常往往令程序员头痛了,现
    // 在系统一般都比较复杂,而且由很多人共同开发,一不小心就会导致一个
    // 指针变量指向了其它非法区域,结果意外灾难不幸发生了。catch(…)为这种
    // 潜在的隐患提供了一种有效的补救措施。
    catch(…)

    }
    }

    还有,特别是VC程序员为了使开发的系统有更好的可靠性,往往在应用程序的入口函数中(如MFC框架的开发环境下 CXXXApp::InitInstance())和工作线程的入口函数中加上一个顶层的trycatch块,并且使用catch(…)来捕获一切所有的 异常,如下:

    BOOL CXXXApp::InitInstance()
    {
    if (!AfxSocketInit())
    {
    AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
    return FALSE;
    }

    AfxEnableControlContainer();

    // Standard initialization
    // If you are not using these features and wish to reduce the size
    // of your final executable, you should remove from the following
    // the specific initialization routines you do not need.

    #ifdef _AFXDLL
    Enable3dControls(); // Call this when using MFC in a shared DLL
    #else
    Enable3dControlsStatic(); // Call this when linking to MFC statically
    #endif


    // 注意这里有一个顶层的trycatch块,并且使用catch(…)来捕获一切所有的异常
    try
    {
    CXXXDlg dlg;
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal();
    if (nResponse == IDOK) 
    {
    // TODO: Place code here to handle when the dialog is
    // dismissed with OK
    }
    else if (nResponse == IDCANCEL)
    {
    // TODO: Place code here to handle when the dialog is
    // dismissed with Cancel
    }
    }
    catch(…)
    {
    // dump出系统的一些重要信息,并通知管理员查找出现意外异常的原因。
    // 同时想办法恢复系统,例如说重新启动应用程序等
    }

    // Since the dialog has been closed, return FALSE so that we exit the
    // application, rather than start the application's message pump.
    return FALSE;
    }

       通过上面的例程和分析可以得出,由于catch(…)能够捕获所有数据类型的异常对象,所以在恰当的地方使用catch(…)确实可以使软件系统有着更 好的可靠性。这确实是大家使用catch(…)这个东东最好的理由。但不要误会的是,在C++异常处理模型中,不只有catch(…)方法能够捕获几乎所 有类型的异常对象(也许有其它更好的方法,在下一篇文章中主人公阿愚带大家一同去探讨一下),可C++标准中为什么会想到定义这样一个catch(…) 呢?有过java或C#编程开发经验的程序员会发现,在它们的异常处理模型中,并没有这样类似的一种语法,可这里不得不再次强调的是,java中的异常处 理模型是C++中的异常处理模型的完善改进版,可它反而没有了catch(…),为何呢?还是先去看看下一章吧,“C++的异常处理和面向对象的紧密关系 ”。也许大家能找到一个似乎合理的原因。

     

    展开全文
  • php try catch 应用

    千次阅读 2018-10-26 14:04:29
    有觉得try catch 鸡肋的,捕错还得分错误类型,那要是知道错误类型了,直接就处理了, 还捕什么啊!? 有觉得try catch占资源的 有觉得try catch很有用的 我个人觉得try catch就很有用,但要分应用场景 场景1:事务...

    最近开发中,碰到一个问题,就是Php中try catch的应用
    我们几个同事讨论来讨论去,
    有觉得try catch 鸡肋的,捕错还得分错误类型,那要是知道错误类型了,直接就处理了, 还捕什么啊!?
    有觉得try catch占资源的
    有觉得try catch很有用的
    我个人觉得try catch就很有用,但要分应用场景
    场景1:事务处理中,事务通常都在读写数据库时使用,有时会有数据库异常,而导致不能同步的,这时用try catch 捕捉数据库的异常,可以有效保证数据一致性,当然,事务中的其他正常逻辑判断还是要有的,不能全依靠try catch完成业务逻辑
    场景2:直接操作数据库时使用,本人碰到过的问题是,在yii2环境下,更新数据库的操作中,由于服务器上,屏蔽了错误信息,我又没有服务器的权限,但更新操作就是失败了,没有try catch时,就是直接返回了false,什么错也看不见,后来,在代码里加到了try catch,直接获取到数据库返回的错误,是有一个列不存在,所以,更新失败,从而有效的解决了问题
    其他场景应该也有,只是暂时没想起来
    php7中,try catch 可以捕获很多错误,但要用Error类获取
    例1:个人测试过程中,使用过try catch 捕捉除0的错误,
    如果不加的话,直接是错误界面,用
    catch(\Exception $e) 也不能捕捉错误,
    try {
    $value = 20 % 0;
    return $value;
    } catch (\Exception $e) {
    return $e->getMessage();
    }

    但用catch(\Error $e),就可以捕捉
    try {
    $value = 20 % 0;
    return $value;
    } catch (\Error $e) {
    return $e->getMessage();
    }
    返回:“Modulo by zero”
    例2:个人又用未定义变量来测试,使用未定义的变量 $a,放在catch(\Exception $e)里,就可以捕捉,
    try {
    $value = $a % 0;
    return $value;
    } catch (\Exception $e) {
    return $e->getMessage();
    }
    返回:“Undefined variable: a”
    但使用catch(\Error $e)就捕捉不到,
    try {
    $value = $a % 0;
    return $value;
    } catch (\Error $e) {
    return $e->getMessage();
    }
    原因是,未定义的变量,php环境返回的是PHP Notice,而不是error,所以没catch到

    所以,个人总结的是:根据应用场景,合理使用try catch,不能完全不用,也不能到处乱用(唉,最后竟然总结出来一句废话,真是失败)
    如有不同观点,欢迎留言!

    展开全文
  • Try catch如何使用

    千次阅读 2019-05-16 18:43:36
    try catch适用场合: 一、兼容性 浏览器的兼容性是程序员很头痛的事儿,往往一些出错会让我们查找许久,在使用try catch能更好的解决兼容性出错的问题:由于不同浏览器报错提示也不尽相同,通过使用try catch捕获的...
    try catch适用场合:
    一、兼容性

    浏览器的兼容性是程序员很头痛的事儿,往往一些出错会让我们查找许久,在使用try catch能更好的解决兼容性出错的问题:由于不同浏览器报错提示也不尽相同,通过使用try catch捕获的浏览器的报错提示,来判断用户使用的浏览器,然后做出对应的解决方法;那么,你如果用if,就只能反馈真或假,而不能直接抛出浏览器的报错内容。

    二、防止阻塞

    try catch用于捕捉报错,不关心哪一步错误,只关心有没有错。
    例如:
    1.下面的try里面没有申明 window.a.b;但不会影响执行,会继续往下执行,最后抛出错误;

    try {
       window.a.b !== 1
    }
    catch(err){
         alert(err) // 可执行
         alert('执行弹框') // 可执行
    }
    

    2.做对比,如果用的if语句,则会阻塞执行

    if (window.a.b !== 1) {
    	alert("if语句判断报错,不会执行") // 不执行
    }
    alert('不会执行弹框'); // 不执行
    
    try catch 灵活使用:

    1、一条路不通,就换条路

    try {
     	执行程序逻辑
    } 
    catch (e) {
    	出现问题,换个逻辑执行
    }
    

    2、给用户更好的体验感

    try {
    	正常流程
    } 
    catch (e) {
    	弹个框告诉用户不好意思出了点问题
    	如果是用户的错就告诉用户什么地方错了
    	如果是程序的错,就告诉用户不好意思没法执行
    }
    

    如果你能很好的运用try catch ,势必会让你的程序运行的更流畅,处理问题更加方便!
    分享是一种快乐!

    展开全文
  • php try catch

    2015-10-27 09:05:49
    php的try catch与其它语言的try catch相比有许多不同,而且用起来相对比较不爽。 php中,如果你制作的站点相对较大,同时模块化,并且在错误处理机制上有一套自己的处理机制,可以尝试使用try catch,否则,可以...
  • 有没有因为try catch +return被面试官为难过,来吧,武器在这里,需要的来取吧! 关于try catch +return的一些面试题的总结,希望能帮到大家.感觉学完这些之后就没有什么try catch 的题能难倒自己了! 直接上干货.... ...
  • try catch的作用

    千次阅读 多人点赞 2018-03-29 11:25:16
    try catch的作用:当程序发生错误时,能够保证程序继续执行下去。用一个简单例子说明:1:无try catchpublic static void main(String[] args) { int i; i = 2/0; System.out.println(i); System.out.println...
  • kotlin try catch使用方法

    2020-05-22 14:38:17
    5 kotlin之 try catch kotlin的try catch比Java更简洁面料采用,使用更方便 val value = "10a" var out: Int? = null //错误处理 try { out = Integer.parseInt(value) } catch (e: NumberFormatException) {...
  • 浅谈Java中try catch 的用法

    万次阅读 多人点赞 2018-11-10 15:37:21
    try catch:自己处理异常  * try {  *可能出现异常的代码  *} catch(异常类名A e){  *如果出现了异常类A类型的异常,那么执行该代码  *} ...(catch可以有多个)  * finally {  *最终肯定必须要执行的...
  • try catch 用法

    千次阅读 2017-08-02 10:08:18
    在实际应用中,碰到了一个问题,就是在动态生成一个表格的时候,从后台...这个时候我们就可以使用 try catch 方法 来 处理浏览器的位置错误下面是相对简单的例子:try { foo.bar(); } catch (e) { if (e instanceof E
  • C++:try catch语句用法

    千次阅读 2019-06-15 20:34:22
    C++中try catch语句用法有非常灵活,有许多种组合; 这里简单介绍以下最基本的用法; 1. 格式 try{ ... } catch{ ... } try语句块是用来判断是否有异常; catch语句块捕捉异常,并进行处理; throw是抛出异常...
  • Golang try catch与错误处理

    万次阅读 2019-06-12 23:38:20
    Golang try catch 虽然在使用Golang的时候发现没有try catch这种错误处理机制但是想一想golang作为一门优雅的语言,似乎也是情理之中。因为在java中 throws在函数签名中有一个关键字,旨在使异常流程比较简洁,但是...
  • eclipse 添加try catch

    2019-04-29 13:38:53
    1,选中语句块 2,鼠标右键,选择surround with 3,选择try catch block
  • try catch finally

    2014-07-07 16:25:22
    try { //执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。...//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally }
  • try catch 语句好不好?

    千次阅读 热门讨论 2016-06-12 23:24:38
    try catch 语句好不好? 一句话解释:    try catch机制可以非常好。觉得try catch 不是很好的,可能是还没有发现她的好! 详细解释: 1.程序要健壮,必须要设计报错机制。 最古老,也是最常见的,比如:...
  • try catch捕捉异常分析

    千次阅读 2019-04-22 13:07:52
    try catch捕捉异常 ry cath里面定义function,执行function在try catch面,可以捕捉到 try{ function d(){a.b;} d(); }catch(e){ console.log("error",e); } error ReferenceError: a is not defined at d (<...
  • C# try catch嵌套

    2019-03-26 14:11:00
    try catch嵌套之后出现异常执行顺序: static void Main(string[] args) { try { Console.WriteLine("----------------------外层try------------------------------"); ...
  • try catch 异常捕获处理

    千次阅读 2018-04-20 11:14:36
    try catch 异常捕获处理我们在写代码时喜欢用try catch来捕获异常并且很好用。在我们在项目中是,会遇到Controller层无法捕获异常。回看代码。发现Service层也使用了try catch 。因此我们做了一些统一。把service...
  • try catch 对性能影响

    千次阅读 2017-08-02 11:44:01
    一、比较下面两种try catch写法,哪一种性能更好 for (int i = 0; i ; i++) { try { Math.sin(j); } catch (Exception e) { e.printStackTrace(); }
  • laravel try catch无效

    千次阅读 2018-03-16 11:44:32
    在使用laravel框架的时候使用try catch,发现无效,如下:$note_info = new \stdClass(); try{ $likes = $note_info-&gt;likes; var_dump('1'); } catch (Exception $e){ var_dump...
  • 1、将异常代码块手动处理(try catch)时Transactional不起作用
  • PHP的try catch

    2016-02-15 11:04:13
    PHP的try catch是捕获异常,但它却无法捕获PHP的内部异常,必须是经过throw语句抛出的异常,它才能正常捕获,这也意味着,如果你的try代码块中,没有任何throw语句,或者包含了throw语句的函数,那么,try catch语句...
  • laravel 5 使用try catch

    2019-10-04 06:47:21
    正常我们用try catch的时候 都是try{ //可能异常的代码}catch(Exception $e){ //如果异常,获取异常}但是在laravel5中,强制使用PSR标准,必须使用正确的namespace.因此解决办法是 1、在文件顶部引入use \...
  • try catch finally解惑

    2015-04-26 16:59:37
    try catch finally解惑 Finally通常会配合trycatch使用,在try。。。catch没有退出的语句(return 或者是抛出异常导致退出try。。。catch)执行完try。。。catch语句后,再来执行finally;另外一种情况是在try。...
  • try catch throw用法

    2018-01-11 14:42:44
    try catch throw用法 要防止因为异常产生的内存泄漏,可以使用智能指针,也可以用  __try  {  }  __finally  {  }  《Windows核心编程》一书第23~25章是很好的参考资料。 -----------------...
  • try catch的事务回滚

    千次阅读 2019-01-30 20:07:50
    try catch中需要手动回滚事务,使用Transactional 加 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,157
精华内容 32,062
关键字:

trycatch