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":"u5e74u9f84u4e0du80fdu5927u4e8e120u5c81u3002","file":"/data/mi/demo.php","line":11111111111111111100707200表完成異常自訂
處理
header("Content-type:text/html;charset=utf-8");
class proException extends Exception
{
//依業務需求,自訂方法<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) }<br><br>捕捉多個異常<br><br><?php
header("Content-type:text/html;charset=utf-8");
class proException extends Exception
{
//依業務需求,自訂錯誤方法<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)."rn",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
更多【乾貨分享】,請關注我的個人訂閱號碼。