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