PHP错误处理
来源:互联网 发布:成都金域名人酒店ktv 编辑:程序博客网 时间:2024/05/14 07:20
程序一定会有错误的时候
天才的程序员说,我的程序绝对OK,没有错误,我从不处理错误。的确,天才程序员的程序从来没有错误,但程序只要运行,就会有错误!不管你信不信,我反正是信的。
错误不只是来自于程序逻辑,更多的来自于环境:
- 数据库连接数太多,程序连接数据库失败
- 网络连接故障,连接缓存服务器失败
- Redis缓存已满,无法写入
- 合作方接口异常,无法正常响应
......
太多了,变化的环境总是挑战我的想象力。
真正的程序员很重视错误处理,让程序固若金汤。真正的PHP程序员哪怕是Notice也不放过 :)
首先,要注意和错误有关的PHP配置变量。以下是PHP.ini中的默认值。
display_errors = Offerror_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
这是建议开发环境中设置的值:
display_errors= Onerror_reporting = E_ALL
这是建议服务器环境中设置的值:
display_errors= Offerror_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
PHP中错误报告的级别
以下列出常用的错误报告的级别,所有错误报告的级别点这里
E_WARNING
php -r 'error_reporting(E_ERROR);include "test.php";'//Warning: include(test.php): failed to open stream: No such file or directory in Command line code on line 1
E_NOTICE
php -r 'error_reporting(E_ERROR);echo $a[0];'//Notice: Undefined variable: a in Command line code on line 1
E_PARSE
php -r 'error_reporting(E_ERROR);echo 0'//Parse error: syntax error, unexpected end of file, expecting ',' or ';' in Command line code on line 1
E_USER_WARNING
php -r 'error_reporting(E_ERROR);trigger_error("Value must be 1",E_USER_WARNING);' //Warning: Value must be 1 in Command line code on line 1
E_USER_ERROR
php -r 'error_reporting(E_ERROR);trigger_error("Value must be 1",E_USER_ERROR);' //Fatal error: Value must be 1 in Command line code on line 1
E_USER_NOTICE
php -r 'error_reporting(E_ERROR);trigger_error("Value must be 1",E_USER_NOTICE);' //Notice: Value must be 1 in Command line code on line 1
E_ERROR
php -r 'error_reporting(E_ERROR);$a=null;echo $a->method();'//Fatal error: Call to a member function method() on a non-object in Command line code on line 1php -r 'error_reporting(E_ERROR);require_once("test.php");' //Warning: require_once(test.php): failed to open stream: No such file or directory in Command line code on line 1//Fatal error: require_once(): Failed opening required 'test.php' in Command line code on line 1
用set_error_handler捕获错误
set_error_handler:设置一个用户的函数来处理脚本中出现的错误。
使用set_error_handler捕获程序错误
php -r 'error_reporting(E_ERROR);set_error_handler(function($errno, $errstr, $errfile, $errline){var_dump($errno, $errstr, $errfile, $errline);});require("test.php");echo "finished!";'
从截图中看到,有var_dump的信息,说明set_error_handler捕获到了错误。并且没有看到我需要输出的finished!,说明程序在遇到错误终止了,没有继续运行。
set_error_handler不是万能的,也有捕获不到的时候
php -r 'error_reporting(E_ERROR);set_error_handler(function($errno, $errstr, $errfile, $errline){var_dump($errno, $errstr, $errfile, $errline);});$a=null;$a->method();echo "finished!";'
截图中没有看到var_dump信息,说明set_error_handler没有捕获到错误。这时候要用register_shutdown_function+error_get_last来捕获
php -r 'error_reporting(E_ERROR);function logerror() {if (($error = error_get_last())) {var_dump($error);}}register_shutdown_function('logerror');$a=null;$a->method();echo "finished!";'
错误日志集中管理
错误日志集中管理的平台很多,我们无需多造个轮子。我的选择是Sentry。
Sentry是一个的错误日志服务器,可以将程序错误的详细情况集中捕获,并提供一个很漂亮的Web界面来浏览错误。 Sentry本身是用python写的,但它支持记录python、php、ruby、iOS等多种语言的错误。
0 0
- PHP 错误处理
- PHP 错误处理
- PHP 业务错误处理
- PHP 简单错误处理
- PHP 错误处理
- php 屏蔽错误处理
- PHP错误处理函数
- php错误处理相关
- PHP 错误处理
- PHP错误处理
- php错误处理、异常!
- PHP错误处理
- php错误处理
- PHP错误处理
- PHP 错误,异常处理
- PHP错误处理函数
- PHP错误处理
- PHP错误处理
- 利用栈将输入的十进制数及一些基本的栈操作
- 膜拜了武大Eyelids大神的BLOG后,补得 Codeforces Round #226 (Div. 2)两道题。。。
- ZOJ Problem Set - 1200 (Mining)
- 求余数
- iOS 图像拉伸,stretchableImageWithLeftCapWidth
- PHP错误处理
- iBokan_OC 便利构造器
- Linkdelight推出新产品Fotga渐变ND滤镜
- Kovair插件为Eclipse开发环境
- [wordpress技巧]屏蔽WordPress日志修订功能
- QVector
- K金戒指简单的教训
- KMPlayer的运行时错误 - 修复的Kmplayer运行时错误的简便方法!
- jQTouch创建客户端数据库andTables