介绍
这篇文章主要介绍了CodeIgniter3.0 +框架自如何定义异常处理,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。
背景:ci3.0框架核心代码自动实现了异常,并实现了抛出的对应页面和方法,对于一些个性化需求特别是接口类型的应用,会不合适。因此需要在不改版核心代码(系统目录下文件),来改变对异常及404等相关异常的处理。
方法说明
ci框架3.0比2.0有比较大的改动,其中之一就是对异常的处理。以下是CodeIgniter-3.1.8 \ system \ \ CodeIgniter核心。php中对异常处理的部分代码
/* * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *定义一个自定义错误处理程序我们可以PHP错误日志 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */set_error_handler (& # 39; _error_handler& # 39;); set_exception_handler (& # 39; _exception_handler& # 39;); register_shutdown_function (& # 39; _shutdown_handler& # 39;); …
以上括号内的方法均在<代码>常见。php代码>中以<代码> function_exists> 代码为前提声明。
… 如果(!function_exists (& # 39; _exception_handler& # 39;)) { …
代码实现
我们简单粗暴的在项目入口文件<代码>索引。>
/* * *推送到复述,异常队列 * @time 2019/3/21十五29 * @author * @param $味精 int * @return bool | |字符串 */函数redis_list_add (msg)美元 { 报错(& # 39;default_socket_timeout& # 39;, 1); 美元v=爆炸(& # 39;:& # 39;$ _SERVER [& # 39; SITE_REDIS_SERVER& # 39;]); 如果(is_array (v),,!空(v)美元){ 尝试{ 复述,美元=new复述(); 复述→美元pconnect (v v[0],美元[1]); 跟踪美元=$ _SERVER [& # 39; server_name # 39;]。“;例外\ n"; 跟踪美元。=翱肆痔亍p是{$ _SERVER [& # 39; REMOTE_ADDR& # 39;]}“;。“服务器”;。$ _SERVER [& # 39; server_name # 39;]。“(“;。$ _SERVER [& # 39; SERVER_ADDR& # 39;]。“)“霸主地位;\ n"; 跟踪美元。是“=奥肪丁?收取($ _SERVER [& # 39; REQUEST_URI& # 39;]) ? $ _SERVER [& # 39; REQUEST_URI& # 39;]:“empty")干净\ n"; 跟踪美元。=扒肭髉arams=?。print_r ($ _POST,真实); 返回$复述→LPUSH (& # 39; PHP_ERROR_WARNING& # 39;,跟踪美元。美元味精); }捕捉(异常$ e) { 返回$ e→getMessage (); } } }/* * *优先重写common.php中对应方法 * @time 2019/3/21 16:19 * @author * @param美元严重程度 * @param美元消息 * @param filepath美元 * @param $行 */函数_error_handler(严重性,消息,美元filepath美元,美元线) { 美元is_error=(((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR |代码),严重程度)===美元严重程度); 如果(is_error美元){ (error_msg=美元消息。“\ n"。filepath美元。“\ n"。行美元); redis_list_add ($ error_msg); 退出(json_encode([& # 39;成功# 39;=比;& # 39;1 & # 39;& # 39;代码# 39;=比;501年,& # 39;味精# 39;=比;& # 39;错误# 39;])); } }/* * *捕获php本身语法,对象调用,参数类型传递等错误 *优先重写common.php中对应方法 * ParseError,对象(错误)、TypeError错误 * @time 2019/3/20十八33 * @author *例外(@param美元 */函数_exception_handler(美元除外) { $ _tmp=,load_class(& # 39;例外# 39;,& # 39;核心# 39;); 如果(!空(例外)美元){ (error_msg=美元异常→getMessage ()。“\ n"。异常→美元getTraceAsString ()); redis_list_add ($ error_msg); 退出(json_encode([& # 39;成功# 39;=比;& # 39;1 & # 39;& # 39;代码# 39;=比;501年,& # 39;味精# 39;=比;& # 39;例外# 39;])); } }/* * *优先重写common.php中对应方法 * require_once (& # 39; no_exists.php& # 39;) * @time 2019/3/21利比亚 * @author */_shutdown_handler()函数 { $ last_error=error_get_last (); 如果收取(last_error美元),, ($ last_error[& # 39;类型# 39;],(E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING))) { redis_list_add(味精=last_error美元[& # 39;消息# 39;]。“\ n"。$ last_error[& # 39;文件# 39;]。“\ n"。$ last_error[& # 39;行# 39;]。“\ n"); 退出(json_encode([& # 39;成功# 39;=比;& # 39;1 & # 39;& # 39;代码# 39;=比;501年,& # 39;味精# 39;=比;& # 39;关闭# 39;])); } }/* * *优先重写common.php中对应方法 * ci框架内部的负荷异常,配置异常,装载机异常等会自动抛出, *但common.php中的函数定义之类错误无法捕捉 * @time 2019/3/20 18:46 * @author * @param美元消息 * @param int status_code美元 */函数show_error(消息)美元 { redis_list_add(消息); 退出(json_encode([& # 39;成功# 39;=比;& # 39;1 & # 39;& # 39;代码# 39;=比;& # 39;503 & # 39;& # 39;味精# 39;=比;& # 39;ci_exception_1& # 39;])); }/* * *优先重写common.php中对应方法 * @time 2019/3/21 15:34 * @author * @param字符串$页面 */函数show_404($页面=& # 39;& # 39;) { redis_list_add (url:“;。美元的页面。“;不是found"); 退出(json_encode([& # 39;成功# 39;=比;& # 39;1 & # 39;& # 39;代码# 39;=比;& # 39;404 & # 39;& # 39;味精# 39;=比;& # 39;没有发现# 39;])); }CodeIgniter3.0 +框架自如何定义异常处理