一:缺点Error

1.1 什么是缺点及缺点的级别

缺点是指在开拓阶段中由一些失落误引起的程序问题,根据其涌如今编程过程中的不同环节。
这些缺点一样平常是由PHP内部引擎和扩展程序引发,或通过 trigger_error() 函数抛出

php的异常处理PHP异常处置及留意事项 Ruby

PHP中每个缺点都有一个缺点级别与之对应,如表所示

级别

解释

E_ALL

所有缺点和警告信息

E_ERROR

致命的运行时缺点(它会阻挡脚本运行)

E_WARNING

运行时警告(非致命的缺点)

E_PARSE

编译时语法解析缺点

E_NOTICE

运行时关照,表示脚本碰着可能会表现为缺点的情形

E_STRICT

启用 PHP 对代码的修正建议

E_CORE_ERROR

PHP初始启动期间发生的致命缺点

E_CORE_WARNING

PHP初始启动期间涌现的警告(非致命的缺点)

E_COMPILE_ERROR

编译时致命缺点

E_COMPILE_WARNING

编译时警告(非致命缺点)

E_USER_ERROR

用户产生的缺点信息

E_USER_WARNING

用户产生的警告信息

E_USER_NOTICE

用户产生的关照信息

每个缺点级别常量都是一个整数,此处并没有列出其值,利用时可以通过按位运算符来组合这些常量,用来表示某些类型的缺点

1.2 显示缺点级别

在开拓程序时,有时希望可以掌握是否显示缺点以及显示缺点的级别。
为此,PHP供应了两种方法来显示缺点报告,如下所示:

1.2.1 修正配置文件

在配置文件 php.ini 中修正配置指令error_reporting的值,修正完成后重新启动Web做事器,详细示例如下:

error_reporting(E_All & ~E_NOTICE);display_errors=on;

把稳:如果不知道 php.ini 文件的详细位置,可以利用 php --ini 查看配置文件的详细位置

error_reporting:显示缺点的级别,多个缺点级别用 & 分割,如果不想显示某个缺点级别只须要在缺点级别前加上 ~ 符号即可,这个符号等同于逻辑符号 取反 的意思

display_errors:是否开启显示缺点,默认为开启(on),关闭设置为 off 即可

重启web做事时,如果是nginx做事器类型的做事器,须要重启php-fpm

1.2.2 ini_set()和error_reporting()函数

除了通过配置文件修正显示缺点级别,还可以通过 ini_set() 和 error_reporting() 函数来实现。

error_reporting()函数等同于配置文件中的 error_reporting 配置选项。

ini_set()函数可以设置配置文件中所有可配置的选项,自然也包括error_reporting选项。
其格式如下:

ini_set(string $varname, string $newvalue)

$varname:配置文件中的配置选项

$newvalue:新的值

1.3 缺点日志记录

不管是何种类型的缺点,默认情形下,PHP都会给出提示信息。
在实际Web开拓中,显示缺点会造成极差的用户体验,还会给做事器带来安全隐患。
例如缺点信息一样平常包含文件路径信息,黑客据此可以发起攻击。
故此,实际事情中,我们不会显示系统缺点,一样平常都是把缺点信息记录到日志文件。

缺点日记的记录可以通过 php.ini 文件配置,紧张便是开启日志记录和记录日志的文件路径:

# 开启缺点日志log_errors = On# 缺点日志记录的文件路径error_log = '/tmp/runtime/php/error.php'

正式环境,建议大家关闭显示缺点信息,把所有缺点记录到日志文件中。
这样可以有效避免黑客攻击我们的做事器。

1.4 自定义缺点处理函数

通过 set_error_handler() 函数设置全局缺点处理函数。
如果我们设置了处理函数,PHP涌现缺点时,就会把所有缺点回调到我们设定的函数中,详细用法如下:

set_error_handler(callable $error_handler, int $error_types = E_ALL | E_STRICT)

error_handler:缺点处理句柄,即缺点处理的回调函数

error_types:缺点类型,可以是多个

用户自定义的函数(error_handler)的参数:

$error_type:缺点类型$errstr:缺点信息$errfile:产生缺点的文件地址$errline:产生缺点的行号$errcontext:包含参数和变量信息

整体用法如下:

function error_function($error_level, $error_message, $error_file, $error_line, $error_context){ // 缺点处理逻辑}// 设置缺点处理句柄set_error_handler('error_function', E_WARNING); // 这里error_function对应上面创建的自定义处理器名,第二个参数为利用自定义缺点处理器的缺点级别;

现在我们就可以在缺点处理句柄中处理详细的缺点逻辑,报错日志记录等。

二:非常(Exception)

上面我们先容了缺点及缺点级别,但是缺点每每只是粗浅的记录的缺点信息及产生缺点的文件。
但是缺点是不可预见的,无法提前处理。
但是有些缺点我们是可以提前预见到的,比如某个参数漏了,或者参数的值不对时,我们就该当这类缺点做出警告并记录缺点信息。
如何优雅的实现这样的需求呢?此时非常处理就能很好的实现该功能了。

非常处理是对可预见且可处理的缺点情形进行处理,一样平常都是由开拓者自己手动创建并抛出。

Error和Exception都实现了Throwable接口,大部分Error和所有Exception都可以利用catch (Throwable $e)捕获它们

2.1 非常处理机制

throw语句抛出非常后,如果非常没有被try/catch捕获并处理,程序会终止并报出致命缺点,如果是被 set_exception_handler() 捕获后,程序会终止。
相反,如果被try/catch捕获后,程序可以连续实行。

2.2 捕获非常

set_exception_handler(callable $exception_handler)函数设置默认的非常处理函数。
可以捕获大部分缺点和非常,但不能捕获警告和关照类型的缺点。
利用方法和上面的 set_error_handler() 相同,大家可以参考上面的写法

2.3 try/catch 捕获非常

大部分的Error 和所有 Exception非常都能被捕获,而warning和notice类的缺点(Error)不能被捕获并且通过 trigger_errors() 抛出的用户级别的缺点不能被捕获。
格式如下:

<?phptry { // PHP 脚本实行发生缺点或手动抛出错误 throw new Exception('缺点信息');} catch (Exception $e) { // 根据类型捕获缺点 var_dump('非常');} finally { // 非常处理完之后依然会实行finally,如果不想非常处理完后实行finally,可以在catch中利用exit()终止程序 // return 语句之后仍会实行 finally,但 die 和 exit 后不会实行 finally var_dump('不管有没有非常都会实行的代码块');}

把稳:exit()及die()是终止程序,无法捕获。
因此,exit()和die()之后不会实行finally 。
但是如果我们在try/catch内return,末了依然会实行finally

在当代PHP的web框架中,框架都已经帮我们实现的非常捕获干系封装,如果我们想要自己接管非常处理,可以通过配置非常句柄显示。
例如,ThinkPHP中就可以通过配置 think\exception\Handle 来接管非常处理句柄

有遗漏或者不对的可以在我的"大众年夜众号留言哦