<?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