ホームページ > バックエンド開発 > PHPチュートリアル > ThinkPHP ソースコード分析シリーズ - 例外処理

ThinkPHP ソースコード分析シリーズ - 例外処理

WBOY
リリース: 2016-06-13 13:05:12
オリジナル
1105 人が閲覧しました

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>
ログイン後にコピー
?

デバッグメカニズムがオフになっている場合、つまり運用環境では、エラーページの表示をカスタマイズできます。システムがカスタム エラー表示テンプレートを見つけられない場合、上記の例外ページ テンプレートが表示されます。

?

(終わり)

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート