简介
异常用于在指定的错误发生时改变脚本的正常流程。
异常处理函数
- Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
- Throw - 里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。
- Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。
异常处理规则
- 需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
- 每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
- 使用多个 catch 代码块可以捕获不同种类的异常。 可以在 try 代码块内的 catch
- 代码块中抛出(再次抛出)异常。
简而言之:如果抛出了异常,就必须捕获它。
配合常用内置函数
函数 | 说明 |
---|---|
getLine() | 异常代码行号 |
getFile() | 文件名称 |
getMessage() | 异常信息 |
示例
<?php
// 在 try 块 触发异常
try
{
//异常错误代码
1>2;
// Throw 触发异常,对应 catch
throw new Exception("程序异常说明,该段代码有问题请检查");
// 程序异常后边都代码,如果以上代码抛出异常则不执行以下代码,而是直接返回异常信息
echo '程序正常则执行此代码';
}
// 捕获异常
catch(Exception $e)
{
echo '程序错误信息: ' .$e->getMessage();
}
?>
自定义异常处理类
当 PHP 中发生异常时,可调用其函数。该类必须是 exception 类的一个扩展。
<?php
class customException extends Exception
{
public function errorMessage()
{
// 自定义显示错误信息
$errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> 不合法';
return $errorMsg;
}
}
$email = "someone@example...com";
try
{
// 检测邮箱
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
// 如果是个不合法的邮箱地址,抛出异常
throw new customException($email);
}
}
catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}
?>
多重异常处理
可以为一段脚本使用多个异常,来检测多种情况。
<?php
class customException extends Exception
{
public function errorMessage()
{
// 错误信息
$errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> 不合法';
return $errorMsg;
}
}
$email = "someone@test.com";
try
{
// 检测邮箱
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
// 如果是个不合法的邮箱地址,抛出异常
throw new customException($email);
}
// 检测 "qq" 是否在邮箱地址中
if(strpos($email, "qq") == False)
{
throw new Exception("$email 不是 QQ 邮箱");
}
echo "邮箱合法!";
}
catch (customException $e)
{
echo $e->errorMessage();
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
自定义重新抛出异常
上面的代码检测在邮件地址中是否含有字符串 "example"。如果有,则再次抛出异常:
<?php
class customException extends Exception
{
public function errorMessage()
{
// 错误信息
$errorMsg = $this->getMessage().' 不能是google邮箱!';
return $errorMsg;
}
}
$email = "someone@google.com";
try
{
try
{
// 检测 "qq" 是否在邮箱地址中
if(strpos($email, "google") == True)
{
// 如果是个不合法的邮箱地址,抛出异常
throw new Exception($email);
}
echo "邮箱 $email 合法,程序正常!";
}
catch(Exception $e)
{
// 重新抛出异常
throw new customException($email);
}
}
catch (customException $e)
{
// 显示自定义信息
echo $e->errorMessage();
}
?>
顶层异常处理器
set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。
<?php
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>