模拟的一种异常机制
- 用 __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() 来捕获异常。
网友评论