首頁 > php教程 > php手册 > PHP異常的捕獲及處理

PHP異常的捕獲及處理

WBOY
發布: 2016-08-10 08:49:02
原創
1269 人瀏覽過

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

更多【乾貨分享】,請關注我的個人訂閱號碼。

PHP異常的捕獲及處理

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板