PHP 异常
什么是异常?
异常是一个对象,它描述了 PHP 脚本的错误或意外行为。
许多 PHP 函数和类都会抛出异常。
用户定义的函数和类也可以抛出异常。
异常是当函数遇到无法使用的的数据时停止函数的好方法。
抛出异常
throw
语句允许用户定义的函数或方法抛出异常。当抛出异常时,后面的代码将不会执行。
如果异常没有被捕获,将发生致命错误,并显示“未捕获异常”消息。
让我们尝试抛出一个异常,而不捕获它。
示例
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("除以零");
}
return $dividend / $divisor;
}
echo divide(5, 0);
?>
自己尝试 »
结果看起来像这样
致命错误: 未捕获异常: 除以零 in C:\webfolder\test.php:4
堆栈跟踪: #0 C:\webfolder\test.php(9)
divide(5, 0) #1 {main} 在 C:\webfolder\test.php 文件的第 4 行抛出异常
try...catch 语句
为了避免上面的例子中出现的错误,我们可以使用 try...catch
语句来捕获异常并继续执行程序。
语法
try {
可能抛出异常的代码
} catch(Exception $e) {
捕获异常时执行的代码
}
示例
当异常被抛出时显示一条消息
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("除以零");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $e) {
echo "无法除以 0。";
}
?>
自己尝试 »
catch 块指定了要捕获的异常类型以及用于访问异常的变量名。在上面的例子中,异常类型是 Exception
,变量名为 $e
。
try...catch...finally 语句
可以使用 try...catch...finally
语句来捕获异常。无论是否捕获到异常,finally
块中的代码都将始终执行。如果存在 finally
块,则 catch
块是可选的。
语法
try {
可能抛出异常的代码
} catch(Exception $e) {
捕获异常时执行的代码
} finally {
无论是否捕获到异常,始终执行的代码
}
示例
当异常被抛出时显示一条消息,然后指示进程已结束
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("除以零");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $e) {
echo "无法除以 0。 ";
} finally {
echo "进程完成。";
}
?>
自己尝试 »
示例
即使没有捕获到异常,也输出一个字符串
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("除以零");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} finally {
echo "进程完成。";
}
?>
自己尝试 »
异常对象
异常对象包含有关函数遇到的错误或意外行为的信息。
语法
new Exception(message, code, previous)
参数值
参数 | 描述 |
---|---|
message | 可选。描述为什么抛出异常的字符串 |
code | 可选。一个整数,可用于轻松地区分同一类型的其他异常 |
previous | 可选。如果此异常是在另一个异常的 catch 块中抛出的,建议将该异常传递给此参数 |
方法
捕获异常时,下表显示了一些可用于获取有关异常信息的方法
方法 | 描述 |
---|---|
getMessage() | 返回一个字符串,描述为什么抛出异常 |
getPrevious() | 如果此异常是由另一个异常触发的,此方法返回之前的异常。如果没有,则返回 null |
getCode() | 返回异常代码 |
getFile() | 返回抛出异常的文件的完整路径 |
getLine() | 返回抛出异常的代码行的行号 |
示例
输出有关抛出异常的信息
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("除以零", 1);
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $ex) {
$code = $ex->getCode();
$message = $ex->getMessage();
$file = $ex->getFile();
$line = $ex->getLine();
echo "在 $file 的第 $line 行抛出异常: [代码 $code]
$message";
}
?>
自己尝试 »
完整的异常参考
有关完整参考,请访问我们的 PHP 异常完整参考。
参考包含所有异常方法的描述和示例。