PHP中的Exception类实现了Throwable接口,它是所有可抛出异常的基类。而ErrorException类则继承自Exception类,用于表示运行时错误。如果想要捕获和处理一些通知或警告级别的错误时,可以显式地抛出一个继承自ErrorException类的异常对象。
一、PHP核心错误常量
PHP核心包含以下预定义的错误常量:
值 | 常量 | 描述 |
1 | E_ERROR | 致命的运行时错误。 |
2 | E_WARNING | 运行时警告(非致命错误)。 |
4 | E_PARSE | 编译时解析错误。 |
8 | E_NOTICE | 运行时通知。 |
16 | E_CORE_ERROR | 在PHP的初始启动过程中发生的致命错误。 |
32 | E_CORE_WARNING | 在PHP的初始启动过程中发生的警告(非致命错误)。 |
64 | E_COMPILE_ERROR | 致命的编译时错误。 |
128 | E_COMPILE_WARNING | 编译时警告(非致命错误)。 |
256 | E_USER_ERROR | 用户生成的错误消息。 |
512 | E_USER_WARNING | 用户生成的警告消息。 |
1024 | E_USER_NOTICE | 用户生成的通知消息。 |
2048 | E_STRICT | 如果启用,PHP建议更改您的代码,以确保代码的互操作性和向前兼容性。 |
4096 | E_RECOVERABLE_ERROR | 可捕获的致命错误。 |
8192 | E_DEPRECATED | 运行时通知。 |
16384 | E_USER_DEPRECATED | 用户生成的警告消息。 |
32767 | E_ALL | 所有错误和警告,E_STRICT |
二、类摘要
class ErrorException extends Exception { /* 属性 */ protected int $severity = E_ERROR; /* 继承的属性 */ protected string $message = ""; private string $string = ""; protected int $code; protected string $file = ""; protected int $line; private array $trace = []; private ?Throwable $previous = null; /* 方法 */ public __construct( string $message = "", int $code = 0, int $severity = E_ERROR, ?string $filename = null, ?int $line = null, ?Throwable $previous = null ) final public getSeverity(): int /* 继承的方法 */ final public Exception::getMessage(): string final public Exception::getPrevious(): ?Throwable final public Exception::getCode(): int final public Exception::getFile(): string final public Exception::getLine(): int final public Exception::getTrace(): array final public Exception::getTraceAsString(): string public Exception::__toString(): string private Exception::__clone(): void
三、属性
在异常处理中,severity(严重程度)通常用来指定异常的级别或优先级,以便开发人员可以根据不同级别对异常进行分类和处理。
四、示例
使用 set_error_handler() 函数将错误信息托管至 ErrorException。:
<?php function exception_error_handler(int $errno, string $errstr, string $errfile = null, int $errline) { if (!(error_reporting() & $errno)) { // 这个错误代码未包含在 error_reporting 中 return; } throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); } set_error_handler(exception_error_handler(...)); // 在 PHP 8.1.0 引入 First-class 可调用语法之前,必须使用下面的调用来代替 // set_error_handler(__NAMESPACE__ . "\\exception_error_handler"); /* 触发异常 */ strpos(); ?>
以上示例的输出类似于:
Fatal error: Uncaught exception 'ErrorException' with message 'strpos() expects at least 2 parameters, 0 given' in /home/bjori/tmp/ex.php:12 Stack trace: #0 [internal function]: exception_error_handler(2, 'strpos() expect...', '/home/bjori/php...', 12, Array) #1 /home/bjori/php/cleandocs/test.php(12): strpos() #2 {main} thrown in /home/bjori/tmp/ex.php on line 12