• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

ThinkPHP源码分析系列—异常处理

php 搞代码 3年前 (2022-01-24) 53次浏览 已收录 0个评论
文章目录[隐藏]

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 .= ")
"; } $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['me·本2文来源gaodai$ma#com搞$代*码网2搞gaodaima代码ssage'] = C('ERROR_MESSAGE'); // 包含异常页面模板 include C('TMPL_EXCEPTION_FILE'); } } exit; // 发生错误时,退出程序}

?

halt函数首先会检查PHP的SAPI(服务器端应用编程接口),如果为CLI方式,则直接退出程序。目前流行的方式是PHP作为一个模块被加载到Apache中,这个时候PHP的SAPI为apache2handler。ThinkPHP为方便应用程序的开发,提供了一套调试机制。当处于开发阶段时,可以开启调试机制,方便查错。而在部署环境阶段时,则关闭调试机制,提高应用的效率和安全性。在这两种情况下,错误处理也是不同的。


当开启调试机制时,如果传递的错误数据信息不是以数组形式存储的,则将PHP内置回溯函数debug_backtrace处理的数据存储在一数组中,其中包括错误信息,文件名,类和函数等数据。如果传递的错误数据信息是以数组形式存储的,则为该数组建立索引即可。最后通过配置的异常页面模板格式化显示错误信息,默认异常页面模板放在框架模板目录下,关键内容贴在这里:

系统发生错误

您可以选择 [ ">重试 ] [ 返回 ] 或者 [ ">回到首页 ]
<?php if(isset($e['file'])) {?>

错误位置: FILE: <?php echo $e['file'] ;?> LINE: <?php echo $e['line'];?>

<?php }?>

[ 错误信息 ]

<?php echo $e['message'];?>

<?php if(isset($e['trace'])) {?>

[ TRACE ]

<?php echo nl2br($e['trace']);?>

<?php }?>

?

当关闭调试机制时,也就是在生产环境中,可以自定义错误页面显示。如果系统找不到自定义错误显示模板,则会渲染上面的异常页面模板。

?

(完)


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:ThinkPHP源码分析系列—异常处理

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址