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

模拟异常的一种思路

作者: 许一沐 | 来源:发表于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