• PHP的异常处理


    PHP 的异常处理

        1、 什么是异常?

    异常是指一个程序在运行过程出现的一个意外或者事件,中断了正常指令的执行,跳转到其他模块继续执行。

          PHP 5 提供了一种新的面向对象的错误处理方法。
            异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。

    当异常被触发时,通常会发生:
                当前代码状态被保存
                代码执行被切换到预定义的异常处理器函数
                根据情况,处理器也许会从保存的代码状态重新开始执行代码,
                终止脚本执行,或从代码中另外的位置继续执行脚本
            我们将展示不同的错误处理方法:
                异常的基本使用
                创建自定义的异常处理器
                多个异常
                重新抛出异常
                设置顶层异常处理器    

    2. 异常处理类
    PHP具有很多异常处理类,其中Exception是所有异常处理的基类。
    Exception::__clone — 异常克隆{}
    final private void Exception::__clone ( void )   尝试克隆异常,这将导致一个致命错误。 


    Exception具有几个基本属性与方法,其中包括了:

    message 异常消息内容

     code 异常代码
     file 抛出异常的文件名
     line 抛出异常在该文件的行数
    其中常用的方法有:
    getTrace 获取异常追踪信息
     getTraceAsString 获取异常追踪信息的字符串
     getMessage 获取出错信息


    在PHP代码中所产生的异常可被 throw 语句抛出并被 catch 语句捕获。需要进行异常处理的代码都必须放入到 try 代码块内,以便捕获可能存在的异常。每个try至少对应一个 catch 块。使用多个 catch 可以捕获不同的类所产生的异常。当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行。当然,PHP 允许在 catch 代码块内再次抛出(throw)异常。

    例如:

    扩展(extend) PHP 内置的异常处理类

    <?php
    /**
     * 自定义一个异常处理类
     */
    class MyException extends Exception
    {
        // 重定义构造器使 message 变为必须被指定的属性
        public function __construct($message, $code = 0, Exception $previous = null) {
            // 自定义的代码
    
            // 确保所有变量都被正确赋值
            parent::__construct($message, $code, $previous);
        }
    
        // 自定义字符串输出的样式
        public function __toString() {
            return __CLASS__ . ": [{$this->code}]: {$this->message}
    ";
        }
    
        public function customFunction() {
            echo "A custom function for this type of exception
    ";
        }
    }
    
    
    /**
     * 创建一个用于测试异常处理机制的类
     */
    class TestException
    {
        public $var;
    
        const THROW_NONE    = 0;
        const THROW_CUSTOM  = 1;
        const THROW_DEFAULT = 2;
    
        function __construct($avalue = self::THROW_NONE) {
    
            switch ($avalue) {
                case self::THROW_CUSTOM:
                    // 抛出自定义异常
                    throw new MyException('1 is an invalid parameter', 5);
                    break;
    
                case self::THROW_DEFAULT:
                    // 抛出默认的异常
                    throw new Exception('2 is not allowed as a parameter', 6);
                    break;
    
                default: 
                    // 没有异常的情况下,创建一个对象
                    $this->var = $avalue;
                    break;
            }
        }
    }
    
    
    // 例子 1
    try {
        $o = new TestException(TestException::THROW_CUSTOM);
    } catch (MyException $e) {      // 捕获异常
        echo "Caught my exception
    ", $e;
        $e->customFunction();
    } catch (Exception $e) {        // 被忽略
        echo "Caught Default Exception
    ", $e;
    }
    
    // Continue execution
    var_dump($o); // Null
    echo "
    
    ";
    
    
    // 例子 2
    try {
        $o = new TestException(TestException::THROW_DEFAULT);
    } catch (MyException $e) {      //  不能匹配异常的种类,被忽略
    
        echo "Caught my exception
    ", $e;
        $e->customFunction();
    } catch (Exception $e) {        // 捕获异常
        echo "Caught Default Exception
    ", $e;
    }
    
    // 执行后续代码
    var_dump($o); // Null
    echo "
    
    ";
    
    
    // 例子 3
    try {
        $o = new TestException(TestException::THROW_CUSTOM);
    } catch (Exception $e) {        // 捕获异常
        echo "Default Exception caught
    ", $e;
    }
    
    // 执行后续代码
    var_dump($o); // Null
    echo "
    
    ";
    
    
    // 例子 4
    try {
        $o = new TestException();
    } catch (Exception $e) {        // 没有异常,被忽略
        echo "Default Exception caught
    ", $e;
    }
    
    // 执行后续代码
    var_dump($o); // TestException
    echo "
    
    ";
    ?> 
    

      



    加油,朝着梦想前进
  • 相关阅读:
    悟透JavaScript(理解js面向对象)(转)
    spark相关问题
    hive常见问题以及解析
    visual studio code添加leetcode插件
    阿里云oss的使用
    Poi工具类快速生成Ecxel(升级版)
    linux实现增量拷贝数据,代替scp
    nginx实现均衡负载
    idea 程序包不存在 解决办法
    通过word文件模板生成word文件
  • 原文地址:https://www.cnblogs.com/scmy707248119-/p/7263706.html
Copyright © 2020-2023  润新知