PHP 例外をキャッチして処理します ~
システムには例外処理が付属しています<?php<br />
header("コンテンツタイプ:text/html;charset=utf-8");<br />
試してみてください<br />
{<br />
//業務処理エラーが発生した場合に例外がスローされる。 <br />
$年齢 = 130;<br />
If ($age > 120) {<br />
新しい例外をスローします(「年齢は120歳を超えることはできません。」, 1001);<br />
}<br />
} catch (例外 $e) {<br />
$err = [<br />
「コード」 => $e->getCode(),<br>
'msg' => $e->getMessage(),<br>
'ファイル' => $e->getFile(),<br>
'ライン' => $e->getLine()<br>
];<br>
エコー json_encode($err);<br>
}<br>
<br>
出力: {"code":1001,"msg":"u5e74u9f84u4e0du80fdu5927u4e8e120u5c81u3002","file":"/data/mi/demo.php","line":11}
カスタム例外処理<?php <br />
header("コンテンツタイプ:text/html;charset=utf-8");<br />
クラス proException は Exception を拡張します<br />
{<br />
// ビジネスニーズに応じてメソッドをカスタマイズします<br />
/**<br />
* エラーメッセージを取得します<br />
* @param int $type type 1=json 2=array<br />
* @return 配列<br />
*/<br />
パブリック関数 getErrorInfo($type = 2)<br />
{<br />
$err = [<br />
「コード」 => $this->getCode(),<br>
'メッセージ' = & gt; getMessage (), <br>;
「ライン」 => $this->getLine()<br>
];<br>
If ($type == 1) {<br>
return json_encode($err);<br>
}<br>
戻る
}<br>
}<br>
<br>
試してみてください<br>
{<br>
//業務処理エラーが発生した場合に例外がスローされる。 <br>
$年齢 = 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 歳を超えることはできません。" string(17 ) "/data/mi/demo.php" ["line"]=> int(53) }<br><br>複数の例外をキャッチします
header("コンテンツタイプ:text/html;charset=utf-8");
クラス proException は Exception を拡張します<br />
{<br />
// ビジネスニーズに応じてエラーメソッドをカスタマイズします<br />
<br />
/**<br />
* エラーメッセージを取得します<br />
* @param int $type type 1=json 2=array<br />
* * @戻り配列<br />
*/<br />
パブリック関数 getErrorInfo($type = 2)<br />
{<br />
$err = [<br />「コード」 => $this->getCode(),<br>
'メッセージ' = & gt; getMessage (), <br>;
「ライン」 => $this->getLine()<br>
];<br>
If ($type == 1) {<br>
return json_encode($err);<br>
}<br>
戻る
}<br>
}<br>
<br>
試してみてください<br>
{<br>
If ($_GET['age'] > 100) {<br>
throw new proException('カスタマイズされた例外処理', 1002);<br>
} その他 {<br>
Throw new Exception('システムの例外処理', 1002);<br>
}<br>
} catch (proException $e) {<br>
$info = $e->getErrorInfo();<br>
var_dump($info);<br>
} catch (例外 $e) {<br>
エコー $e->getMessage();<br>
}<br>
<br>
?age=110 出力: array(4) { ["code"]=> int(1002) ["msg"]=> string(24) "カスタマイズされた例外処理" ["file"]=> 17) "/data/mi/demo.php" ["line"]=> int(64) }<br>;
?age=20 出力: システム例外処理。 <br><br>ロギング<b>//エラー出力を無効にする</b>
エラー報告(0);<code class="prettyprint linenums lang-php">
//エラーハンドラーを設定します<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>
* @戻り文字列<br>
*/<br>
関数 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>
* @戻り文字列<br>
*/<br>
関数 FatalErrorHandler() {<br>
$e = error_get_last();<br>
スイッチ ($e['type']) {<br>
ケース 1:<br>
errorHandler($e['type'], $e['message'], $e['file'], $e['line']);<br>
休憩;<br>
}<br>
}<br>
<br>
クラスDemoClass_1<br>
{<br>
パブリック関数index()<br>{<br>
//ここで警告エラーが発生したため、errorHandler を開始します<br>
echo $unknownVariable;<br>
}<br>
}<br>
<br>
$demo_1 = 新しい DemoClass_1();<br>
// ここで警告エラーが発生し、errorHandler によってキャプチャされました<br>
$demo_1->index();<br>
//致命的なエラーが発生し、スクリプトの実行が停止し、fatalErrorHandler がトリガーされます<br>
$demo_2 = 新しい DemoClass_2();<br>
$demo_2->index();<br>
<br>
エコーをオンにした後、出力: <br>
[2016-08-07 09-01-34] | 未定義の変数: /data/mi/demo.php |
[2016-08-07 09-01-34] 1 | クラス 'DemoClass_2' が見つかりません |
1. register_shutdown_function は、API デバッグでも使用して、各リクエスト値と戻り値を記録し、デバッグを容易にすることができます。 <br>
2. 「|」を使用して分割する利点は、ログの分割に awk を使用すると便利であることです。
出典: http://mp.weixin.qq.com/s?__biz=MjM5NDM4MDIwNw==&mid=2448834645&idx=1&sn=32c96f1344a270755a8e33a6f7ddc1e8#rd
もっと[辛口な情報共有]をしたい場合は、私の個人購読アカウントをフォローしてください。