PHP - 异常处理
Throwable 接口
在 PHP 中,异常是表示异常条件的对象。当代码中发生特定错误时,会抛出异常。PHP 提供了 Throwable
接口,这是所有异常和错误的基础类。它有几个方法,可以有效地处理异常。
基本异常处理
要在 PHP 中处理异常,可以使用 try-catch
块。以下是一个示例:
<?php
try {
// 可能抛出异常的代码
throw new Exception("发生错误!");
} catch (Exception $e) {
// 处理异常的代码
echo "捕获异常: " . $e->getMessage();
}
?>
在这个示例中,我们使用 throw
语句创建一个新的 Exception
对象,并附上一个自定义消息。如果在 try
块中抛出了异常,代码执行将跳转到相应的 catch
块,在那里捕获并处理异常。
set_exception_handler
set_exception_handler
函数允许你定义一个自定义函数,当抛出未捕获的异常时,该函数将被调用。这个函数应该接受两个参数:异常对象和一个布尔值,指示异常是否在调用 eval()
时抛出。
以下是如何使用 set_exception_handler
的示例:
<?php
function myExceptionHandler($exception) {
echo "未捕获的异常: " . $exception->getMessage();
}
set_exception_handler('myExceptionHandler');
// 抛出异常的代码
throw new Exception("哎呀!出问题了。");
?>
在这个示例中,我们定义了一个名为 myExceptionHandler
的自定义异常处理函数。然后我们使用 set_exception_handler
将此函数设置为默认异常处理程序。当抛出未捕获的异常时,我们的自定义函数将被调用,而不是默认的处理程序。
SPL 异常
PHP 在标准 PHP 库(SPL)中提供了几个内置异常类。这些类扩展了 Exception
类,并提供了关于不同类型异常的更具体信息。一些常见的 SPL 异常包括:
-
BadFunctionCallException
:当回调引用未定义的函数或缺少某些参数时抛出。 -
DomainException
:用于应用程序域逻辑中的错误。 -
InvalidArgumentException
:当函数接收到的参数不符合要求时抛出。 -
LengthException
:当操作尝试使用长度不正确的对象时使用。 -
OutOfBoundsException
:当数组索引超出范围时抛出。 -
OutOfRangeException
:当值不在预期范围内时抛出。 -
RangeException
:当值不在指定范围内时使用。 -
RuntimeException
:用于运行时错误的通用目的异常。 -
UnderflowException
:当发生下溢(例如,从空栈中减去)时抛出。 -
UnexpectedValueException
:当值与期望的类型不匹配时抛出。
您可以在代码中使用这些 SPL 异常,就像使用其他异常类一样。例如:
<?php
function divide($a, $b) {
if ($b == 0) {
throw new DivisionByZeroError("不允许除以零。");
}
return $a / $b;
}
try {
echo divide(10, 0);
} catch (DivisionByZeroError $e) {
echo "捕获异常: " . $e->getMessage();
}
?>
用户定义的异常
除了使用内置的 SPL 异常外,您还可以创建自己的自定义异常类。为此,只需扩展 Exception
类并添加所需的任何额外功能。以下是一个示例:
<?php
class MyCustomException extends Exception {
public function __construct($message, $code = 0, Exception $previous = null) {
parent::__construct($message, $code, $previous);
}
}
try {
throw new MyCustomException("这是一个自定义异常。");
} catch (MyCustomException $e) {
echo "捕获自定义异常: " . $e->getMessage();
}
?>
在这个示例中,我们创建了一个名为 MyCustomException
的新类,它扩展了 Exception
类。然后我们抛出并捕获这个自定义异常的实例,就像处理其他异常一样。
遵循这些指南并使用提供的工具,您可以有效地处理 PHP 代码中的异常,并确保您的应用程序能够抵御意外错误。记住,要彻底测试您的代码,并优雅地处理异常,以提供更好的用户体验。
Credits: Image by storyset