美文网首页程序员工具箱
模拟异常的一种思路

模拟异常的一种思路

作者: 许一沐 | 来源:发表于2022-06-15 16:28 被阅读0次

    模拟的一种异常机制

    • 用 __TRY() 设置捕获点;
    • 用 __CATCH() 捕获异常;
    • 用 __THROW() 抛出异常;
    • 程序在使用 __THROW() 抛出异常后,必须使用 return false 退出函数或类方法的执行;
    • __TRY() 和 __CATCH() 必须成对调用,并且 __CATCH() 只能捕获一个异常;
    • 用 __IS_EX() 来判断 __CATCH() 的返回值是否是一个异常;
    • 如果 __TRY() 调用后没有用 __CATCH() 捕获异常,必须用 __CANCEL_TRY() 取消捕获。
    • 建议 __THROW() 抛出的异常是从 base_ex 继承的

    原型

    stack = [];
    
    __TRY() => 
        static points = 0;
        points++;
        push(stack, points);
    
    __CANCEL_TRY() =>
        pop(stack);
    
    
    __CATCH() => 
        ex = pop(stack);
        return false if (!is_object(ex)) 
        return ex
    
    
    __THROW(ex) =>
        point = pop(stack);
        if (point != null): 
            push(stack, ex);
            return false;
        
        ex_handler(ex);
    
    
    __IS_EX(ex, type = null) =>
        return false if (!is_object(ex) || !is_a(ex, 'base_ex'));
        return true if ( is_null(type) );
        return strtoupper(type) == strtoupper(get_class(ex))
    

    实例

    // example1
    
    __TRY();
    ret = doSomething(); // 调用可能会发生异常的代码
    ex = __CATCH();
    if (__IS_EX(ex)) {
        // 处理异常
    } else {
        echo ret;
    }
    *
    function doSomething() {
        if (rand(0, 9) % 2) {
            __THROW(new MyEx);
            return false;
        }
        return true;
    }
    
    // example2
    
    function doSomething() {
        if (rand(0, 9) % 2) {
            __THROW(new MyEx);
            return false;
        } else {
            __TRY();
            callAnotherFunc();
            ex = __CATCH();
            if (__IS_EX(ex)) {
                // 处理 callAnotherFunc() 函数抛出的异常
                ...
                // 根据处理结果,可以用 __THROW() 重新抛出这个异常,
                // 让调用 doSomething() 的代码去处理该异常
                __THROW(ex);
                return false;
            }
            return true;
        }
    }
    

    特别要注意的就是使用 __THROW() 抛出异常后,必须 return false

    由于 doSomething() 中的 __THROW() 实际上并不中断程序执行,所以调用 doSomething() 的
    代码要负责检查返回值,或者在调用 doSomething() 以后理解捕获异常。

    为此,__TRY() 和 __CATCH() 之间的代码要尽可能的少。

    对于 __TRY() 和 __CATCH() 的嵌套问题:

    是允许 __TRY() 嵌套的。例如在上面代码中,doSomething() 函数调用了其他可能抛出
    异常的代码。则在 doSomething() 中也可以通过 __TRY() 和 __CATCH() 来捕获异常。

    相关文章

      网友评论

        本文标题:模拟异常的一种思路

        本文链接:https://www.haomeiwen.com/subject/qjpxvrtx.html