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