问题:在许多「重异常」(exception-heavy) 的编程语言中,一旦发生编译错误或Runtime异常,就会抛出异常,阻止或者继续运行。这确实是一个可行的方式。不过 PHP 语言却是一个 「轻异常」(exception-light) 的语言。在php项目中默认的产生 E_NOTICE 型异常时,并不会阻止脚本运行,除非产生严重错误。 不过可以通过配置 error_reporting 选项改变这一问题。
建议在项目开发中 不要把 error_reporting 报告级别调高。 反而建议将其调节到最低,在程序中去隐式去处理任何级别的异常或错误,这样才能更好优化你的代码而达到最好的性能。
在项目中 单入口启动加载脚本中 设置
error_reporting(E_ERROR | E_WARNING | E_NOTICE); // 将安全级别调至最低
或者 配置 php.ini 中的 error_reporting E_ERROR | E_WARNING | E_NOTICE
在项目中编写全局异常捕获类 ExceptionHandle.php
**该种方式仅支持传统的 web项目,不支持swoole环境 swoole环境异常参考
**
ExceptionHandle.php 类核心代码:
// 主要捕获全局错误
set_error_handler(function(int $errno,string $errstr,string $errfile,int $errline){
// todo
// 用于捕获运行时异常 包括 E_WARNING | E_NOTICE 级别的异常和警告
});
set_exception_handler(function(Throwable $e){
// todo 主要用于捕获严重语法错误 或 开发者 手动抛出的异常
// 返回异常类名,可根据异常类名知道异常的类型,做不同的修复和处理
$className=get_class($e);
});
注意 : 在swoole 运行环境下不支持 这两个函数 捕获异常,必须在当前进程内使用
try{} catch(Throwable $e){} 的方式捕获。
,但是swoole中 可通过register_shutdown_function来捕获致命错误,在进程异常退出时做一些清理工作
3 . 关于项目业务代码中的异常处理
1. 业务关键代码中,根据不同的业务,建议开发者手动抛出不同的异常。个人习惯使用 php
运行时内置异常 RuntimeException。当然关键代码建议手写异常类,实现Throwable 接口
...
throw new RuntimeException("参数params 不存在");
...