讨论php的错误和异常处理机制
更新时间:2023-10-26错误处理机制
PHP中的错误分为三类:普通错误、警告和致命错误。可以通过错误报告级别来控制脚本对这些错误的处理方式。error_reporting() 函数返回当前错误报告级别,set_error_handler() 函数设置用于处理至少一个错误的用户定义的错误处理函数。
<?php
// 错误级别设置为E_ALL, 打印所有错误信息
error_reporting(E_ALL);
// 错误处理函数
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr";
}
// 设置错误处理函数
set_error_handler("customError");
// 触发错误
$test=2;
if ($test>1) {
trigger_error("变量值必须小于等于 1",E_USER_NOTICE); // 触发自定义警告
}
?>
异常处理机制
PHP中也有异常处理机制,异常是一种可以被throw语句抛出的运行时错误,它表示程序运行过程中的一个意外情况,抛出异常的代码需要用try…catch语句块来捕获并处理异常。PHP中的Throwable接口继承自Exception,是所有异常和错误的基类。
<?php
// 创建自定义异常类
class customException extends Exception {
public function errorMessage() {
// 错误信息
$errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> 不是一个合法的E-Mail地址';
return $errorMsg;
}
}
// 触发异常
$email = "someone@example.com";
try {
// 检测邮箱格式
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
// 如果不是一个合法的邮箱地址,抛出异常
throw new customException($email);
}
}
catch (customException $e) {
// 输出错误信息
echo $e->errorMessage();
}
?>
处理未捕获的异常
如果异常没有被try...catch 块捕获,则会引发一个致命错误,中断程序的执行,并生成以下类型的错误:
- E_ERROR - 致命的运行时错误
- E_CORE_ERROR - PHP启动时初始化过程中发生的致命错误
- E_COMPILE_ERROR - 编译时致命错误
要用set_exception_handler()函数设置一个用户定义的异常处理程序来捕获未捕获的异常。
<?php
// 创建自定义处理异常的方法
function myException($exception) {
echo "<b>异常信息:</b> " . $exception->getMessage();
}
// 自定义异常处理器
set_exception_handler('myException');
// 触发一个异常
throw new Exception('未捕获异常测试');
?>
自定义错误和异常处理类
在开发应用程序时,通常会为不同的错误和异常场景编写自定义的错误和异常处理程序。下面是一个自定义错误处理类和一个自定义异常处理类的示例:
<?php
// 自定义错误处理类
class customError {
public function isError($errno, $errstr, $errfile, $errline) {
error_log("ERROR: $errno - $errstr, line $errline in file $errfile");
header("HTTP/1.1 500 Internal Server Error");
echo "对不起,应用程序遇到了一个错误,稍后请再尝试。";
}
}
// 设置错误处理函数
$ce = new customError();
set_error_handler(array($ce, 'isError'));
// 自定义异常处理类
class customException extends Exception {
public function errorMessage() {
// 错误信息
$errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> 不是一个合法的E-Mail地址';
error_log($errorMsg);
header("HTTP/1.1 500 Internal Server Error");
echo "对不起,应用程序遇到了一个错误,稍后请再尝试。";
}
}
// 触发异常
$email = "someone@example.com";
try {
// 检测邮箱格式
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
// 如果不是一个合法的邮箱地址,抛出异常
throw new customException($email);
}
}
catch (customException $e) {
// 输出错误信息
echo $e->errorMessage();
}
?>