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为方便应用程序的开发,提供了一套调试机制。当处于开发阶段时,可以开启调试机制,方便查错。而在部署环境阶段
时,则关闭调试机制,提高应用的效率和安全性。在这两种情况下,错误处理也是不同的。
当开启调试机制时,如果传递的错误数据信息不是以数组形式存储的,则将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>
当关闭调试机制时,也就是在生产环境中,可以自定义错误页面显示。如果系统找不到自定义错误显示模板,则会渲染上面的异常页面模板。
(完)
分享到:
相关推荐
thinkphp完整源码.rar
130套thinkphp5网站模板源码,企业网站建设thinkphp模板,建站thinkphp源码模板网站搭建
thinkphp框架源码交易系统资源网站源码
thinkphp6.0源码
拍卖网pc-wap-thinkphp源码
基于thinkphp开发的CRM客户管理系统,全部源码开源,无加密,能进行运维。也适合php开发者学习参考。
OA微信办公thinkphp源码
DOC版本的,php框架ThinkPHP代码分析核心解析.
thinkphp开发发卡网源码thinkphp开发发卡网源码thinkphp开发发卡网源码thinkphp开发发卡网源码thinkphp开发发卡网源码thinkphp开发发卡网源码thinkphp开发发卡网源码thinkphp开发发卡网源码thinkphp开发发卡网源码...
thinkphp福娃源码交易网站源码.zip
源码 thinkphp是一个学习php的很好的开源框架
ThinkPHP在线驾考答题源码,ThinkPHP在线驾考答题源码,ThinkPHP在线驾考答题源码,ThinkPHP在线驾考答题源码
thinkphp_thinkphp_thinkphp5_源码.zip
thinkphp3.0源码和实例,是学习thinkphp的非常好的资源,
使用ThinkPHP开发的社交网站源码 对于学习Thing看PHP技术的人很有用
这是我使用composer下载的thinkphp6源码,欢迎大家来下载。
ThinkPHP官方网站源码 版本:ThinkPHP 3.0
ThinkPHP问答社区系统源码,问答讨论社区系统源码,一套基本的问答讨论社区框架,基于thinkphp开发,只是部分不太完善,基础的问答模块还是比较完整的,有能力的大佬可以拿去二开一下使用的。 ThinkPHP问答社区系统...
ThinkPHP项目企业网站源码CMS内容管理系统源码