php 异常处理以前是这样的。
1 | try { |
以上有什么问吗? 有。太他妈烦了,我要有10个地方可能抛异常,10个地方这样整也不好, 太
烦了。 那能不能代码复用,统一处理,还可以做下日志记录啥的?嘿嘿__!行的! 既然要玩那就做个正经些的demo。
上composer.
1创建demo
- 1.1
make demo && cd demo; 创建demo项目,并进入项目根目录 - 1.2
composer init;或许要输入姓名和邮箱其它啥也不用管,一路开车enter. - 1.3 修改
composer.json,注册本地项目命名空间;
新建字段autoload,配置自动引入目录app;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15{
"name": "nginx/demo",
"authors": [
{
"name": "wuchuheng",
"email": "wuchuheng@163.com"
}
],
"autoload": {
"psr-4":{
"app\\": "app/"
}
},
"require": {}
}
composer update 更新下
这样为只要载入vender/autoload.php,就根据命名空间来加载类。
1.4 创建入口文件和异常处理器
1.4.1在根据目录新建入口文件start.php
1 | /** |
1.4.2 新建处理器文件app\exception\HandlerException.php
1 | /** |
行运结果:
到了这里就已经达到我们的期望,只要在入口文件指定异常的处理位置,那么全局的异常处理
将统一到指定的方法处理,统一输出,如是rest API那就输出json, web就html文本,cli模式等等,是不是不用写很多?
2 进一步封装
异常很多种,常见有验证异常服务器异常等情况发生。所以要把这些异常写成一个个可复用的类
来简化信息系统的简化。哪种情况的异常就抛出哪个,大大提高代码的可读性.我以下我就根据rest API接口模式来撸下代码。
2.1 创建rest API 异常基类
新建文件 app/excetpion/RestBaseException.php
1 | /** |
2.2 验证异常类
1 | /** |
2.3 修改异常处理器类
1 | /** |
2.4 现在可以抛出了
1 | /** |
运行结果:
整体的思路是这样的,首先,不管理是抛出的是什么类,这个类必须是Exception的子类。
而在入口文件指定好异常类,已经指定好异常的触发处理方法。然后,抛过去的类,在由于是RestBaseException的子类,判断成立,就进入到里面了。
3 扩展性
这里要说下异常的扩展性,扩展是可以横向的,文中只是列出一种。可以根据开发的情况,
如是html 的异常那就,新增一个HtmlBaseException类,让html超文本的所以异常类
根据上面的例子来扩容,并在异常处理器添加下判断并把处理业务写进去就行了。
所以整体上来看,异常处理已经听可以划分为一个功能模块来看待。
如 可以这么写:
1 | /** |