PHP异常的捕获及处理 ~
系统自带异常处理<?php <br />
header("Content-type:text/html;charset=utf-8");<br>
try<br>
{<br>
//业务处理 错误时抛出异常。<br>
$age = 130;<br>
if ($age > 120) {<br>
throw new Exception('年龄不能大于120岁。', 1001);<br>
}<br>
} catch (Exception $e) {<br>
$err = [<br>
'code' => $e->getCode(),<br>
'msg' => $e->getMessage(),<br>
'file' => $e->getFile(),<br>
'line' => $e->getLine()<br>
];<br>
echo json_encode($err);<br>
}<br>
<br>
输出:{"code":1001,"msg":"\u5e74\u9f84\u4e0d\u80fd\u5927\u4e8e120\u5c81\u3002","file":"\/data\/mi\/demo.php","line":11}
自定义异常处理<?php <br />
header("Content-type:text/html;charset=utf-8");<br>
class proException extends Exception<br>
{<br>
//根据业务需求,自定义方法<br>
/**<br>
* 获取错误信息<br>
* @param int $type 类型 1=json 2=数组<br>
* @return array<br>
*/<br>
public function getErrorInfo($type = 2)<br>
{<br>
$err = [<br>
'code' => $this->getCode(),<br>
'msg' => $this->getMessage(),<br>
'file' => $this->getFile(),<br>
'line' => $this->getLine()<br>
];<br>
if ($type == 1) {<br>
return json_encode($err);<br>
}<br>
return $err;<br>
}<br>
}<br>
<br>
try<br>
{<br>
//业务处理 错误时抛出异常。<br>
$age = 130;<br>
if ($age > 120) {<br>
throw new proException('年龄不能大于120岁。', 1001);<br>
}<br>
} catch (proException $e) {<br>
$info = $e->getErrorInfo();<br>
var_dump($info);<br>
}<br>
<br>
输出:array(4) { ["code"]=> int(1001) ["msg"]=> string(27) "年龄不能大于120岁。" ["file"]=> string(17) "/data/mi/demo.php" ["line"]=> int(53) }
捕捉多个异常<?php <br />
header("Content-type:text/html;charset=utf-8");<br>
class proException extends Exception<br>
{<br>
//根据业务需求,自定义错误方法<br>
<br>
/**<br>
* 获取错误信息<br>
* @param int $type 类型 1=json 2=数组<br>
* @return array<br>
*/<br>
public function getErrorInfo($type = 2)<br>
{<br>
$err = [<br>
'code' => $this->getCode(),<br>
'msg' => $this->getMessage(),<br>
'file' => $this->getFile(),<br>
'line' => $this->getLine()<br>
];<br>
if ($type == 1) {<br>
return json_encode($err);<br>
}<br>
return $err;<br>
}<br>
}<br>
<br>
try<br>
{<br>
if ($_GET['age'] > 100) {<br>
throw new proException('自定义的异常处理', 1002);<br>
} else {<br>
throw new Exception('系统的异常处理', 1002);<br>
}<br>
} catch (proException $e) {<br>
$info = $e->getErrorInfo();<br>
var_dump($info);<br>
} catch (Exception $e) {<br>
echo $e->getMessage();<br>
}<br>
<br>
?age=110 输出:array(4) { ["code"]=> int(1002) ["msg"]=> string(24) "自定义的异常处理" ["file"]=> string(17) "/data/mi/demo.php" ["line"]=> int(64) }<br>
?age=20 输出:系统的异常处理。
日志记录//禁止错误输出<br>
error_reporting(0);<br>
//设置错误处理器<br>
set_error_handler('errorHandler');<br>
//在脚本结束时运行的函数<br>
register_shutdown_function('fatalErrorHandler');<br>
<br>
/**<br>
* 错误处理<br>
* @param int $err_no 错误代码<br>
* @param string $err_msg 错误信息<br>
* @param string $err_file 错误文件<br>
* @param int $err_line 错误行号<br>
* @return string<br>
*/<br>
function errorHandler($err_no = 0, $err_msg = '', $err_file = '', $err_line = 0)<br>
{<br>
$log = [<br>
'['.date('Y-m-d h-i-s').']',<br>
'|',<br>
$err_no,<br>
'|',<br>
$err_msg,<br>
'|',<br>
$err_file,<br>
'|',<br>
$err_line<br>
];<br>
$log_path = '/data/mi/test.txt';<br>
error_log(implode(' ',$log)."\r\n",3, $log_path);<br>
//echo implode(' ',$log)."<br>";<br>
}<br>
<br>
/**<br>
* 捕捉致命错误<br>
* @return string<br>
*/<br>
function fatalErrorHandler() {<br>
$e = error_get_last();<br>
switch ($e['type']) {<br>
case 1:<br>
errorHandler($e['type'], $e['message'], $e['file'], $e['line']);<br>
break;<br>
}<br>
}<br>
<br>
class DemoClass_1<br>
{<br>
public function index()<br>
{<br>
//这里发生一个警告错误,出发errorHandler<br>
echo $undefinedVarible;<br>
}<br>
}<br>
<br>
$demo_1 = new DemoClass_1();<br>
//这里发生一个警告错误,被errorHandler 捕获<br>
$demo_1->index();<br>
//发生致命错误,脚本停止运行触发 fatalErrorHandler<br>
$demo_2 = new DemoClass_2();<br>
$demo_2->index();<br>
<br>
打开echo后 输出:<br>
[2016-08-07 09-01-34] | 8 | Undefined variable: undefinedVarible | /data/mi/demo.php | 126<br>
[2016-08-07 09-01-34] | 1 | Class 'DemoClass_2' not found | /data/mi/demo.php | 134
备注:
1. register_shutdown_function 也可以用于API调试中,记录每次请求值和返回值,方便调试。
2. 利用 “|” 分割的好处是,便于利用 awk 对日志进行分割处理。
来源:http://mp.weixin.qq.com/s?__biz=MjM5NDM4MDIwNw==&mid=2448834645&idx=1&sn=32c96f1344a270755a8e33a6f7ddc1e8#rd
更多【干货分享】,请关注我的个人订阅号。