为啥使用Try,Catch捕获异常,程序依然Crash

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥使用Try,Catch捕获异常,程序依然Crash相关的知识,希望对你有一定的参考价值。

try catch是一种异常处理机制,但是有两点需要注意。
1.只有在try块内部的代码所抛出的异常才会被捕获,如果是try块范围外的代码,就不会捕捉异常。
2.catch需要指定异常类型。只能够捕获指定的异常类型。如果发生崩溃的异常并没有列在catch中,那么也不会捕获该异常。最终导致程序崩溃。
参考技术A 前段时间学习《深入浅出Nodejs》时,在第四章 - 异步编程中作者朴灵曾提到,异步编程的难点之一是异常处理,书中描述" 尝试对异步方法进行try/catch操作只能捕获当次事件循环内的异常,对call back执行时抛出的异常将无能为力 "。

果然,项目测试过程中,连续两天遇到了Node.js进程Crash的问题。通过Debug Log,究其原因,发现正是书中提到的问题。

例如,
1 //test.js
2
3 var test = undefined;
4
5 try
6 var f1 = function()
7 console.log(test.toString());
8
9
10 catch(e)
11 console.log('error..');
12
13
14 //assume somewhere f1() will be called as an call back function
15 f1();

这里模仿f1函数是做为call back(回调)函数传递给其他函数,在其他函数执行过程中执行call back的函数。 从代码表面来看,很容易认为如果Line 7 ,
1 console.log(test.toString());

如果这行code发生异常,会自然认为其会被try catch捕获到,并不会引起进程的Crash 。但其实,运行结果是:

运行错误,Line 11的错误并没有打印,说明在程序中错误没有被Try Catch。而Nodejs作为单进程单线程程序,将会引起进程的Crash!

------------------------------------------------------------------------------------------------------------------------

因此,在进行异步编程时,个人觉得:

要考虑到call back函数可能产生的错误,增加类型检查代码或在Call back被真正执行的地方增加Try cach等,避免异常未能被捕获导致进程Crash

------------------------------------------------------------------------------------------------------------------------

如本例,可修改如下,
1 if(typeof(test) != 'undefined')
2 console.log(test.toString());
3

或者
1 console.log(test? test.toString() : '[undefine]');

或者
1 try
2 f1();
3
4 catch(e)
5
6 console.log('new error..');
7

这样,再次运行程序,就可以避免异常,避免进程的Crash。

try使用多个catch捕获不同的异常

目的:

使用多个catch捕获不同的异常

eg:

<?php
//创建三个Exception
class AException extends Exception{
    function printMsg(){
        echo "This is AException.";
    }
}
class BException extends Exception{
    function printMsg(){
        echo "This is BException.";
    }
}class CException extends Exception{
    function printMsg(){
        echo "This is CException.";
    }
}


//一个try,多个catch捕获不同的异常
try{
    $flag = 1;
    switch ($flag)
    {
        case 1:
            throw new AException(‘AException:‘);
            break;
        case 2:
            throw new BException(‘BException:‘);
            break;
        case 3:
            throw new CException(‘CException:‘);
            break;
        default:
            break;
    }
}
catch(AException $e){
    echo $e->getmessage();
    $e->printMsg();
}
catch(BException $e){
    echo $e->getmessage();
    $e->printMsg();
}
catch(CException $e){
    echo $e->getmessage();
    $e->printMsg();
}
catch(Exception $e){
    //这个catch主要是捕获漏网之鱼
    echo $e->getmessage();
}

 

输出:

AException:This is AException.

 

以上是关于为啥使用Try,Catch捕获异常,程序依然Crash的主要内容,如果未能解决你的问题,请参考以下文章

为啥 iOS 开发中很少用到 try catch 语句

用powershell的try catch, 为啥try里面出现异常,catch 捕获不到呢?

php中,用try/catch捕获了异常,为啥还会有警告?有没有办法去掉呢?

2019-12-2 异常捕获

使用try和catch捕获异常

JAVA中try catch捕获异常的问题