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);
?>
亲自试一试 »
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
echo divide(5, 0);
?>
结果如下所示:
Fatal error: Uncaught Exception: Division by zero in
C:\webfolder\test.php:4
Stack trace: #0 C:\webfolder\test.php(9):
divide(5, 0) #1 {main} thrown in C:\webfolder\test.php on line 4
Stack trace: #0 C:\webfolder\test.php(9):
divide(5, 0) #1 {main} thrown in C:\webfolder\test.php on line 4
try...catch 语句
为了避免上述示例中的错误,我们可以使用 try...catch
语句捕获异常并继续该过程。
语法
try {
code that can throw exceptions
} catch(Exception $e) {
code that runs when an exception is caught
}
code that can throw exceptions
} catch(Exception $e) {
code that runs when an exception is caught
}
实例
显示引发异常时的消息:
<?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 "Unable to divide.";
}
?>
亲自试一试 »
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 "Unable to divide.";
}
?>
catch 块指示应捕获的异常类型以及可用于访问异常的变量的名称。在上面的示例中,异常的类型是 Exception
,变量名是 $e
。
try...catch...finally 语句
try...catch...finally
语句可用于捕获异常。无论是否捕获到异常,
finally
块中的代码都将始终运行。如果存在
finally
,则 catch
块是可选的。
语法
try {
code that can throw exceptions
} catch(Exception $e) {
code that runs when an exception is caught
} finally {
code that always runs regardless of whether an exception was caught
}
code that can throw exceptions
} catch(Exception $e) {
code that runs when an exception is caught
} finally {
code that always runs regardless of whether an exception was caught
}
实例
引发异常时显示消息,然后指示进程已结束:
<?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 "Unable to divide. ";
} finally {
echo "Process complete.";
}
?>
亲自试一试 »
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 "Unable to divide. ";
} finally {
echo "Process complete.";
}
?>
实例
即使未捕获异常,也输出字符串:
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} finally {
echo "Process complete.";
}
?>
亲自试一试 »
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} finally {
echo "Process complete.";
}
?>
Exception 异常对象
Exception 对象包含有关函数遇到的错误或意外行为的信息。
语法
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("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";
}
?>
亲自试一试 »
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 异常参考手册
如需完整的 PHP 异常参考手册,请访问我们的 PHP 异常参考手册。
该参考手册包含所有异常方法的描述和示例。