PHP基础-异常处理

简介

异常用于在指定的错误发生时改变脚本的正常流程。

异常处理函数
  • 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');
?>

转载于:https://my.oschina.net/zhaojunhui/blog/3085110

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值