http://bbs.phpchina.com/viewthread.php?tid=80911&extra=&highlight=%E5%BC%82%E5%B8%B8&page=1
http://bbs.phpchina.com/thread-220520-1-1.html
这篇文章是讲怎么使用异常, 不是讲怎么写异常, 怎么写异常具体一些教程和手册
有些教程中会看到一个这样的例子
try
{
...
throw new Exception(...);
...
}
catch(Exception $e)
{
...
}
这段代码没有错误, 但是这么使用异常是没有作用的, 一般不会这么写的, 这样的异常都没有发挥作用.
而某些教程中这样的例子完全是误导读者.
先看看传统的错误处理, 如果一个数据库查询错误:
function databasequery(...)
{
...
if(error)
return error;//返回错误消息
...
}
function foo1(...)
{
...
$result = databasequery(...);
if($result is error)
return error;//返回错误消息
...
}
function foo2(...)
{
...
$bar = foo1(...);
if($bar is error)
return error;//返回错误消息
...
}
...... //中间还有其它的调用函数
$bar = fooN(...);
if($bar is error)
die(error);//显示错误
这段代码的调用关系是: 我的代码 => fooN() => ... => foo2() => foo1() => databasequery()
这个可以看出, 传统的错误处理的问题是:
1. 一级一级的返回错误消息.
2. 每次都要判断一下是否错误.
3. 还要处理不是自己的错误.
4. 每一级都要重复处理.
5. 还要知道被调用者将会调用什么, 会返回什么错误
......
而异常完全可以解决这些问题, 看用异常后的代码:
function databasequery(...)
{
...
throw new QueryException(...);
...
}
function foo1(...)
{
...
$result = databasequery(...);
...
}
function foo2(...)
{
...
$bar = foo1(...);
...
}
...... //中间还有其它的调用函数
try
{
...
$bar = fooN(...);
...
}
catch(Exception $e)
die($e->getMessage());//显示错误
这样上面的那些问题将不都再存在.
还可以针对不同的异常做不同的处理, 可以写多个catch去捕捉不同的异常, 做不同的处理.
返回的只有正确的数据, 不会返回错误消息等等不相关的数据.
每一级都不要去判断, 并再传出错误消息, 并自动会中断后面的运行.
现在我想你可以看出了, 那段部分教程中示例的问题了.
异常刚抛后, 就被自己给捕捉了, 那异常还有什么作用呢?
而有些被误导的读者, 会在那段代码catch中再加入返回错误, 这样又回到了原来的错误处理了.
好了, 希望这篇文章对你有帮助. :)