PHP 异常
什么是异常?
异常是一个描述 PHP 脚本错误或意外行为的对象。
许多 PHP 函数和类都会抛出异常。
用户定义的函数和类也可以抛出异常。
当函数遇到无法使用的数据时,抛出异常是停止该函数的好方法。
抛出异常
throw
语句允许用户定义的函数或方法抛出异常。当抛出异常时,它后面的代码将不会执行。
如果异常未被捕获,将会发生一个致命错误,并显示“未捕获的异常”消息。
让我们尝试在不捕获异常的情况下抛出它
示例
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
echo divide(5, 0);
?>
自己动手试一试 »
结果将类似于:
致命错误: 未捕获的异常: 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("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $e) {
echo "无法除法。";
}
?>
自己动手试一试 »
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("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $e) {
echo "无法除法。 ";
} finally {
echo "进程完成。";
}
?>
自己动手试一试 »
示例
即使未捕获到异常,也输出字符串
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} finally {
echo "进程完成。";
}
?>
自己动手试一试 »
异常对象
异常对象包含有关函数遇到的错误或意外行为的信息。
语法
new Exception(message, code, previous)
参数值
参数 | 描述 |
---|---|
message | 可选。一个描述异常抛出原因的字符串 |
代码 | 可选。一个整数,可用于轻松区分相同类型的其他异常 |
previous | 可选。如果此异常是在另一个异常的 catch 块中抛出的,则建议将该异常传递到此参数 |
方法
捕获异常时,下表显示了一些可用于获取有关异常的信息的方法
方法 | 描述 |
---|---|
getMessage() | 返回一个描述异常抛出原因的字符串 |
getPrevious() | 如果此异常是由另一个异常触发的,则此方法返回前一个异常。如果不是,则返回 null |
getCode() | 返回异常代码 |
getFile() | 返回抛出异常的文件的完整路径 |
getLine() | 返回抛出异常的代码行的行号 |
示例
输出已抛出异常的信息
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero", 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 "Exception thrown in $file on line $line: [Code $code]
$message";
}
?>
自己动手试一试 »
完整的异常参考
有关完整参考,请访问我们的 完整的 PHP 异常参考。
参考包含所有异常方法的描述和示例。