PHP - 异常

Throwable 接口

在 PHP 中,异常是表示异常情况的物件。当您的代码中发生特定错误时,会抛出异常。PHP 提供了 Throwable 接口,这是所有异常和错误的基础类别。它有几个方法,允许您有效地处理异常。

PHP - Exceptions

基本异常处理

要在 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