ホームページ >バックエンド開発 >PHPチュートリアル >ThinkPHP ソースコード分析シリーズ - 例外処理
ThinkPHP ソースコード分析シリーズ - エラー処理
ThinkPHP には、エラーのフォーマットと表示に特に使用されるグローバル関数 halt があり、システム にあります。 関数ライブラリで見つけてください。この機能により、アプリケーションのエラー処理の一貫性を確保できます。
最初にコードを投稿してください:
function halt($error) { if (IS_CLI) exit($error); $e = array(); if (C('APP_DEBUG')) { //调试模式下输出错误信息 if (!is_array($error)) { $trace = debug_backtrace(); // 返回多维数组 $e['message'] = $error; $e['file'] = $trace[0]['file']; $e['class'] = $trace[0]['class']; $e['function'] = $trace[0]['function']; $e['line'] = $trace[0]['line']; $traceInfo = ''; $time = date("y-m-d H:i:m", $_SERVER["REQUEST_TIME"]); foreach ($trace as $t) { $traceInfo .= '[' . $time . '] ' . $t['file'] . ' (' . $t['line'] . ') '; $traceInfo .= $t['class'] . $t['type'] . $t['function'] . '('; $traceInfo .= implode(', ', $t['args']); $traceInfo .= ")<br/>"; } $e['trace'] = $traceInfo; } else { $e = $error; } // 包含异常页面模板 include C('TMPL_EXCEPTION_FILE'); } else { //否则定向到错误页面 $error_page = C('ERROR_PAGE'); if (!empty($error_page)) { redirect($error_page); // 自定义错误页面 } else { if (C('SHOW_ERROR_MSG')) $e['message'] = is_array($error) ? $error['message'] : $error; else $e['message'] = C('ERROR_MESSAGE'); // 包含异常页面模板 include C('TMPL_EXCEPTION_FILE'); } } exit; // 发生错误时,退出程序 }
?
halt 関数は、まず PHP の SAPI (サーバー側アプリケーション プログラミング インターフェイス) をチェックし、CLI モードの場合はプログラムを直接終了します。現在、PHP をモジュールとして Apache にロードする方法が一般的です。現時点では、PHP の SAPI は apache2handler です。 ThinkPHP は、アプリケーション開発を容易にするデバッグ メカニズムを提供します。開発段階では、トラブルシューティングを容易にするためにデバッグ メカニズムを有効にすることができます。そして、デプロイメント環境 ステージ 、アプリケーションの効率とセキュリティを向上させるために、デバッグ メカニズムはオフになります。これら 2 つの場合では、エラー処理も異なります。
デバッグメカニズムが有効な場合、渡されたエラーデータ情報が配列形式で格納されていない場合、PHP 組み込みバックトレース関数 debug_backtrace によって処理されたデータは配列に格納されます。エラー情報、ファイル名、クラスおよび関数データが含まれます。渡されたエラーデータ情報が配列形式で格納されている場合は、配列のインデックスを作成するだけです。最後に、構成された例外ページ テンプレートを通じてエラー メッセージがフォーマットされ、表示されます。デフォルトの例外ページ テンプレートはフレームワーク テンプレート ディレクトリに配置され、主要なコンテンツはここに投稿されます。
<div class="notice"> <h2>系统发生错误 </h2> <div >您可以选择 [ <A HREF="<?php echo($_SERVER['PHP_SELF'])?>">重试</A> ] [ <A HREF="javascript:history.back()">返回</A> ] 或者 [ <A HREF="<?php echo(__APP__);?>">回到首页</A> ]</div> <?php if(isset($e['file'])) {?> <p><strong>错误位置:</strong> FILE: <span class="red"><?php echo $e['file'] ;?></span> LINE: <span class="red"><?php echo $e['line'];?></span></p> <?php }?> <p class="title">[ 错误信息 ]</p> <p class="message"><?php echo $e['message'];?></p> <?php if(isset($e['trace'])) {?> <p class="title">[ TRACE ]</p> <p id="trace"> <?php echo nl2br($e['trace']);?> </p> <?php }?> </div>?
デバッグメカニズムがオフになっている場合、つまり運用環境では、エラーページの表示をカスタマイズできます。システムがカスタム エラー表示テンプレートを見つけられない場合、上記の例外ページ テンプレートが表示されます。
?
(終わり)