自定义异常的使用

<?php
// 报告所有错误(适用于开发环境)
ini_set('display_errors', 'On');
error_reporting(-1);

/**
 * 自定义异常(继承通用异常Exception)
 */
class MyException extends Exception
{
    /**
     * 构造方法
     *
     * @param string $message 异常信息
     * @param int $code 异常代码
     * @param Throwable $previous
     */
    public function __construct($message = '', $code = 0, Throwable $previous = null)
    {
        parent::__construct($message, $code, $previous);
    }
}

/**
 * Demo类
 */
class Demo
{
    /**
     * 测试方法
     * 功能说明:参数只允许输入true/false,其余都抛出异常。
     *
     * @param bool $bool true/false
     * @return bool
     * @throws MyException
     */
    public function func($bool)
    {
        if (is_bool($bool)) {
            return $bool;
        }

        $message = "参数无效(仅支持bool类型),您输入的是:{$bool}";
        $code = 9527;
        throw new MyException($message, $code); // 抛出异常后不会再执行后面的代码
        // echo 'Unreachable statement'; // 这里不会执行,因为上面抛出了异常
    }
}

$demo = new Demo();

try {
    $demo->func(true);
    echo 'try-1   ===> 无异常' . PHP_EOL; // try-1   ===> 无异常
} catch (MyException $e) {
    echo 'catch-1 ===> ' . $e->getMessage() . PHP_EOL;
}

try {
    $demo->func(9527);
    echo 'try-2   ===> 无异常' . PHP_EOL;
} catch (MyException $e) {
    echo 'catch-2 ===> ' . $e->getMessage() . PHP_EOL; // catch-2 ===> 参数无效(仅支持bool类型),您输入的是:9527
}

try {
    $demo->func(false);
    echo 'try-3   ===> 无异常' . PHP_EOL; // try-3   ===> 无异常
} catch (MyException $e) {
    echo 'catch-3 ===> ' . $e->getMessage() . PHP_EOL;
}

//========== 总结 ==========//
// 1、函数或方法如果可能会抛出异常,那么调用处必须使用try-catch捕获异常,因为如果不捕获异常而程序又恰好出现异常,那么系统就会报致命错
//    误“Fatal error: Uncaught MyException”。
// 2、PHP内置了很多标准异常,在创建自定义异常前可以先查阅文档是否有满足需求的标准异常,优先使用内置标准异常,不能满足需求的情况下才创
//    建自定义异常,官方文档地址:https://www.php.net/manual/zh/spl.exceptions.php。
// 3、Exception是通用异常,抛出该异常在维护和调试时帮助比较小,所以在实际开发中应该尽量使用标准异常或自定义异常。
// 4、写try-catch捕获异常时,try{}里面应该只写可能会抛出异常的代码,正常流程时的业务逻辑代码不要写在try{}里面。
// 5、一段流程执行时如果有多处地方会抛出异常,不要嵌套try{},也不要把所有会抛出异常的代码都写在一个try{}里面,而是逐个处理。

Copyright © 2023 码农人生. All Rights Reserved