我想很多PHPer跟我一样,都在混乱的使用die throw 甚至是 exit 来解决流程中的异常

在Pt-framework的开发过程中,需要借鉴很多的框架.嘛,大家对错误异常的处理基本也都百家齐放的状态.
为什么会出现这样的问题? 可能是php对于错误的处理文档相当至少的原因吧.

1.首先让我们看一下原有错误处理函数 set_error_handler

该函数功能是自定义错误函数.通过定义的函数来处理错误等级包括: E_ERROR,E_WARNING,E_NOTICE,E_STRICT,E_USER_ERROR,E_USER_WARNING…等
有了错误级别,然后做什么呢? log/debug/trace 之类..

嘛,那这样看好像很简单.如何触发呢?

2.触发方式 trigger_error

嘛,实际上 E_Error,E_WARNING,E_NOTICE,E_STRICT 这几个不是可以由用户触发的,而是系统级错误,比如内存不足,读取文件不存在等等..
而错误等级 E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE 则需要通过 trigger_error 函数触发


trigger_error("错误信息", E_USER_ERROR);

所以在简单的项目中,我们完全可以使用该函数进行 error/debug 的处理和显示.
然后什么是异常呢?

3.异常 Exception

准确的说异常的出现应该在面相对象之后(异常本身就是对象嘛= =..)
其实本来异常的出现是效仿java的 try…catch..
其目的是:实现各个模块(class)独立的异常处理!

例如:PDOException/SoapFault/DOMException/mysqli_sql_exception/ 等…都是继承Exception

嘛,定义这个的意义何在呢? 便于统一开发,通过错误码errCode读取errMessage, 或者记录错误等级,错误核心内容..嘛,虽然我们用不到就是.

4.抛出异常 throw

抛出异常 throw new Exception(); 这个语句只允许在 try..catch.. 中
不在其中的话…自己就构成了一个 error_handler E_ERROR 级别吧好像是.

所以为了避免这么悲剧的事情发生…(喂,我只是抛个异常,干嘛关掉我…

除了抛出,异常是可以直接打印的 echo new Exception(..); 会调用 __toString 函数

5.于是就有了 set_exception_handler

(咦…我都写的累了…好麻烦…
用它设定一个可以接受异常的函数, 这样空投的异常就被他接收了…

6.然后呢..PHP发现自己的如上混乱局面…加入了 ErrorException (喂…添乱啊!

这样就全了…
总之,我估计大家看上面还算是一头雾水…
还是直接上代码…


// 丢错误改成抛异常...
function error_handler($errno, $errstr, $errfile, $errline)
{
	throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

// 获取被乱抛的异常
function throw_exception($e)
{
	//..这里你就可以发挥你的想象啦~
	//  如果要统一的话, 就在这里定义一个标准页面输出
	//  如果要做其他的, 还是请写在这了..
}

// 注册上述处理函数
set_error_handler('error_handler');
set_exception_handler('throw_exception');

那剩下的问题是:
Q: 框架有必要做自己的异常处理吗?
A: 有,框架核心本身就相当于大的类库,对他独立做一个异常是没有问题的.

Q: 除了接受自己的异常外,还有别的功能么?
A: 还可以统一log.debug.等数据的记录和用于模板显示.把多种 Exception 信息统一起来.

Q: 异常是需要终止运行的么?
A: 个人认为不需要,通常终止的只有两种情况E_ERROR, E_USER_ERROR 严重错误,程序无法继续.而大部分异常,只是无法返回结果.例如列表页,需要读取数据,这时候因为数据库链接过多无法访问,应该提示:数据读取失败,点此重试? 而不是把用户活生生的拖到一个未知的页面,让浏览者无所适从…(嘛说多了…就到这吧.