PHP 具有与其他编程语言类似的异常模型。异常是描述 PHP 脚本的错误或意外行为的对象。许多 PHP 函数和类都会引发异常。用户定义的函数和类也可以抛出异常。当函数遇到无法使用的数据时,异常是停止函数的好方法。
抛出异常
throw关键字用于抛出异常。当抛出异常时,其后面的代码将不会被执行。
请注意,如果未捕获异常,则会发生致命错误,并显示"Uncaught Exception"消息。
考虑下面的示例,其中使用 throw 关键字抛出异常
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
echo divide(25, 0);
?>
上述代码的输出将类似于:
PHP Fatal error: Uncaught Exception: Division by zero in Main.php:4
Stack trace:
#0 Main.php(9): divide()
#1 {main}
thrown in Main.php on line 4
try-catch 块
为了避免上述情况,try-catch 代码块。 try关键字用于测试语句块是否有错误,catch关键字用于定义当错误发生时执行并处理错误的语句块。使用 try-catch 块的语法如下:
语法
try{
statements;
} catch (Exception $e) {
statements;
}
考虑下面的示例,其中 try-catch 代码块用于处理异常。
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(25, 0);
} catch(Exception $e) {
echo "Division by zero is invalid.";
}
?>
在上面的例子中,异常类型为Exception,变量名为$e.上述代码的输出将是:
Division by zero is invalid.
The finally 块
finally 关键字用于定义语句块无论 try-catch 块结果如何,它都会执行。它有助于程序在继续操作之前关闭文件。
语法
try{
statements;
} catch (Exception $e) {
statements;
} finally {
statements;
}
在下面的示例中,使用了 finally 代码块,该代码块在之后执行try-catch 代码块。
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(25, 0);
} catch(Exception $e) {
echo "Division by zero is invalid.\n";
} finally {
echo "try-catch block finished.\n";
}
?>
上述代码的输出将是:
Division by zero is invalid.
try-catch block finished.
异常类
Exception是所有用户异常的基类。 Exception 对象包含有关函数遇到的错误或意外行为的信息。可以使用以下语法创建Exception对象:
语法
public __construct(message, code, previous)
参数
message | 可选。 指定要抛出的异常消息。 |
code | 可选。 指定异常代码。 |
previous | 可选。 指定用于异常链接的前一个异常。 |
方法
异常类提供以下方法:
方法 | 描述 |
---|---|
getMessage() | 获取异常消息 |
getPrevious() | 返回上一个 Throwable |
getCode() | 获取异常代码 |
getFile() | 获取创建异常的文件 |
getLine() | 获取行异常被创建 |
getTrace() | 获取堆栈跟踪 |
getTraceAsString() | 以字符串形式获取堆栈跟踪 |
__toString() | 异常的字符串表示形式 |
考虑下面的示例,其中 使用了异常类方法。
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero", 3);
}
return $dividend / $divisor;
}
try {
echo divide(25, 0);
} catch(Exception $e) {
$code = $e->getCode();
$message = $e->getMessage();
$file = $e->getFile();
$line = $e->getLine();
echo "Exception thrown in $file on line $line: [Code $code]
$message";
}
?>
上述代码的输出将是:
Exception thrown in Main.php on line 4: [Code 3]
Division by zero