遇到异常情况要主动出击,php的库和框架的作者尤其不知道该如何处理,因为他们并不清楚使用框架或库的开发者的具体情况,所以需要抛出异常给开发者处理。
抛出异常并不意味着终止执行,但是try内部的代码会终止执行,而且只有一个catch块会运行,并且finally块是始终运行的。除非在catch块中exit()或者die()掉,整个脚本才会退出。
如果异常没有被catch到,php会产生致命错误,脚本也会退出。
try {
$pdo = new PDO("error occur");
} catch (PDOException $e) {
echo $e->getMessage();
//exit();
} catch (Exception $e) {
echo $e->getMessage();
} finally {
echo "end";
}
echo 111;
php提供了一个全局的异常处理程序,捕获所有未被捕获的异常。 set_exception_handler()
当执行了set_exception_handler之后,脚本会退出
function exception_handler($exception) {
echo "Uncaught exception: " , $exception->getMessage(), "\n";
}
set_exception_handler('exception_handler');
throw new Exception('Uncaught Exception');
echo "Not Executed\n"; //不会执行
https://www.cnblogs.com/yjf512/p/5314345.html
这种错误是致命错误,会在页面显示Fatal Error, 当出现这种错误的时候,程序就无法继续执行下去了
这种错误只是警告,不会终止脚本,程序还会继续进行,显示的错误信息是Warning。
这种错误程度更为轻微一些,提示你这个地方不应该这么写。这个也是运行时错误,这个错误的代码可能在其他地方没有问题,只是在当前上下文情况下出现了问题。
这个错误是编译时候发生的,在编译期发现语法错误,不能进行语法分析。
这个错误是PHP5之后引入的,你的代码可以运行,但是不是PHP建议的写法。
这个级别其实是ERROR级别的,但是它是期望被捕获的,如果没有被错误处理捕获,表现和E_ERROR是一样的。
经常出现在形参定义了类型,但调用的时候传入了错误类型。它的错误提醒也比E_ERROR的fatal error前面多了一个Catachable的字样。
这个错误表示你用了一个旧版本的函数,而这个函数后期版本可能被禁用或者不维护了。
E_CORE_ERROR, E_CORE_WARNING
这两个错误是由PHP的引擎产生的,在PHP初始化过程中发生。
E_COMPILE_ERROR, E_COMPILE_WARNING
这两个错误是由PHP引擎产生的,在编译过程中发生。
E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE, E_USER_DEPRECATED,
这些错误都是用户制造的,使用trigger_error,这里就相当于一个口子给用户触发出各种错误类型。
error_reporting = E_ALL // 报告错误级别,什么级别的
error_log = /tmp/php_errors.log // php中的错误显示的日志位置
display_errors = On // 是否把错误展示在输出上,这个输出可能是页面,也可能是stdout display_startup_errors = On // 是否把启动过程的错误信息显示在页面上,记得上面说的有几个Core类型的错误是启动时候发生的,这个就是控制这些错误是否显示页面的。
log_errors = On // 是否要记录错误日志
log_errors_max_len = 1024 // 错误日志的最大长度
ignore_repeated_errors = Off // 是否忽略重复的错误
track_errors = Off // 是否使用全局变量$php_errormsg来记录最后一个错误
fastcgi.logging = 0 // 是否把php错误抛出到fastcgi中 (就是抛给nginx吧 ?)
error_reporting 表示什么样子的级别才应该报告错误。如果我们告诉PHP,所有错误级别都不需要触发错误,那么,不管是日志,还是页面,都不会有这个错误。
display_errors 是控制是否要在标准输出展示错误信息
log_errors则是控制是否要在日志中记录错误信息。
error_log是显示错误日志的位置,这个在php-fpm中往往会被重写,于是往往会发现的是cli和fpm的错误日志竟然不是在同一个文件中。
error_log = /var/log/php-fpm/error.log // php-fpm自身的日志
log_level = notice // php-fpm自身的日志记录级别
php_flag[display_errors] = off // 覆盖php.ini中的某个配置变量,可被程序中的ini_set覆盖
php_value[display_errors] = off // 同php_flag
php_admin_value[error_log] = /tmp/www-error.log // 覆盖php.ini中的某个配置变量,不可被程序中的ini_set覆盖
php_admin_flag[log_errors] = on // 同php_admin_value
catch_workers_output = yes // 是否抓取fpmworker的输出
request_slowlog_timeout = 0 // 慢日志时长
slowlog = /var/log/php-fpm/www-slow.log // 慢日志记录
php-fpm的配置中也有一个error_log配置,这个很经常会和php.ini中的error_log配置弄混。但他们记录的东西是不一样的,php-fpm的error_log只记录php-fpm本身的日志,比如fpm启动,关闭。
而php.ini中的error_log是记录php程序本身的错误日志。
那么在php-fpm中要覆盖php.ini中的error_log配置,就需要使用到下面几个函数:
php_flag
php_value
php_admin_flag
php_admin_value
admin的两个函数说明这个变量设置完之后,不能在代码中使用ini_set把这个变量重新赋值了。而php_flag/value就仍然以php代码中的ini_set的为准
slowlog是fpm记录的,可以使用request_slowlog_timeout设置判断慢日志的时长。
我们经常弄混的就是日志问题,以及某些级别的日志为何没有记录到日志中。最主要的是要看error_log,display_errors, log_errors这三个配置,只是在看配置的时候,我们还要注意区分php.ini里面的配置是什么,php-fpm.ini里面的配置是什么。