目录
一: 异常(Exceptions)
二: 错误(Errors)
三:实际项目的异常和错误处理
在PHP中,异常(Exceptions)和错误(Errors)是两个不同的概念,尽管它们都与运行时问题有关,但它们有各自的用途和处理方式。
一: 异常(Exceptions)
异常是在程序运行时发生的,可以预期并且通常被设计为在特定条件下被抛出的异常条件。它们通常用于处理可恢复的问题,比如文件未找到、数据库连接失败等。
捕获异常:
你可以使用 try...catch
结构来捕获和处理异常。
try {
//业务代码;
} catch (Exception $e) {
echo '异常捕获: ', $e->getMessage(), "\n";
}
$e->getLine() 返回异常或错误发生的行号。
$e->getMessage() 返回异常或错误的描述消息。
$e->getFile() 返回发生异常或错误的文件名。
$e->getTraceAsString() 返回一个包含异常或错误堆栈跟踪的字符串。堆栈跟踪显示了异常或错误被抛出时程序执行的调用栈。
这个错误很重要哦,当我们的业务调用比较复杂时,可以通过这个发现发生错误的各个代码的行数,方便找到最终的错误源头。
二: 错误(Errors)
错误通常是由不可恢复的问题引起的,比如语法错误、类型错误、调用未定义的函数等。在PHP 7之前,错误通常会导致脚本终止执行,并且没有内置的机制来捕获它们。然而,从PHP 7开始,引入了一个名为 Error
的异常类,使得某些类型的错误可以被捕获和处理,类似于异常。
从PHP 7开始,你可以使用 Throwable
接口来同时捕获异常和错误。
例如
try {
// 可能抛出异常或错误的代码
} catch (Throwable $t) {
// 处理异常和错误
echo '捕获到异常或错误: ', $t->getMessage(), "\n";
}
当然你可以做thinkphp6中这样捕获因为Exception继承了Throwable
try {
// 可能抛出异常或错误的代码
} catch (Exception $e) {
// 处理异常和错误
echo '捕获到异常或错误: ', $e->getMessage(), "\n";
}
当然在实际使用中发现Exception并不能捕获所有的错误,比如函数名找不到可能捕获不到,需要Error中捕获
try {
// 可能抛出异常或错误的代码
} catch( \Exception $e) {
echo $e->getMessage();
} catch (\Error $e) {
echo $e->getMessage();
}
三:实际项目的异常和错误处理
- 全局异常处理:
- 使用一个全局的异常处理器(通过
set_exception_handler()
设置)来捕获未被捕获的异常。 - 在全局异常处理器中,记录错误日志、发送错误报告给开发人员或显示一个用户友好的错误页面。
- 使用一个全局的异常处理器(通过
- 错误处理:
- 对于PHP 7及以上版本,使用
Error
类和Throwable
接口来捕获错误。 - 设置一个全局的错误处理函数(通过
set_error_handler()
),但请注意,它不能捕获所有类型的错误(如致命错误和解析错误)。 - 在错误处理函数中,根据错误的类型和严重性决定是抛出异常、记录日志还是显示错误页面。
- 对于PHP 7及以上版本,使用
- 日志记录:
- 使用一个日志记录库(如Monolog)来记录错误和异常信息。
- 确保日志包含足够的上下文信息,如时间戳、用户ID(如果适用)、请求URI、错误类型和消息、堆栈跟踪等。
- 将日志文件存储在安全的位置,并限制对它们的访问。
- 用户友好的错误页面:
- 为生产环境配置一个自定义的错误页面,该页面应简洁明了,避免显示过多的技术细节。
- 在开发环境中,可以显示更详细的错误信息,以帮助开发人员快速定位问题。