PHP学习笔记16:错误处理

PHP学习笔记16:错误处理

image-20211129162010327

图源:php.net

在之前的笔记PHP学习笔记6:表达式和运算符中介绍位运算时,提过error_reporting函数。事实上在使用php开发项目时,常需要使用相关的错误处理函数来设置环境,以让不同的环境对错误能进行不同的处理。

一般来说,基本原则是在开发环境严格检查错误,并将错误直接输出,这样有利于快速排查错误。而生产和预生产环境需要将错误输出从标准输出屏蔽,因为输出的错误信息可能包含一些敏感信息,这些信息被用户获知可能会影响到系统安全。此外一些不影响系统正常运行的错误信息,比如E_NOTICEE_DEPCATED等错误可以直接关闭。

完整的错误级别见官方手册预定义常量

错误相关设置属于系统基本环境设置的一环,一般会在入口文件加载的相关配置信息处理的脚本中执行,这里给出我编写的一个错误处理示例:

<?php
enum Environment
{
    case PRODUCT; //生产环境
    case DEVELOP; //开发环境
    case PRE_PRODUCT; //预生产环境
}
$configs = array(
    'env' => Environment::PRODUCT,
);
function write_log(string $msg): void
{
    $fopen = fopen("sys.log", "a");
    $msg = date("Y-m-d H:i:s") . ": " . $msg . "\n";
    fwrite($fopen, $msg);
    fclose($fopen);
}
if ($configs['env'] === Environment::DEVELOP) {
    error_reporting(E_ALL);
    ini_set("display_errors", "1");
    function exp_handle($exp)
    {
        if ($exp instanceof Error) {
            echo $exp->error() . PHP_EOL;
        } elseif ($exp instanceof Exception) {
            echo $exp->getMessage() . PHP_EOL;
        } else {
            var_export($exp);
        }
    }
} elseif ($configs['env'] === Environment::PRE_PRODUCT || $configs['env'] === Environment::PRODUCT) {
    error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
    ini_set("display_errors", "stderr");
    function exp_handle($exp)
    {
        if ($exp instanceof Error) {
            write_log($exp->error());
        } elseif ($exp instanceof Exception) {
            write_log($exp->getMessage());
        } else {
            write_log(var_export($exp, true));
        }
    }
} else {;
}
set_exception_handler("exp_handle");

其中使用一个配置变量$configs['env']来区分不同的环境,使用error_reporting分别设置开发环境和生产环境的错误级别,用int_set设置display环境变量,在开发环境错误信息可以正常输出到控制台,而生产环境都输出到标准错误流stderr。函数exp_handle充当一个默认的异常捕获器(从php7开始,php的大部分错误都以抛出一个Error类别的p异常表示),可以捕获未捕获的异常,开发环境直接输出异常相关信息,生产环境将其输出的日志文件。

可以进行一些简单测试:

<?php
require_once './index.php';
fopen("not_exist.txt","r");
<?php
require_once './index.php';
throw new Exception('Uncaught Exception');
echo "Not Executed\n";

这两个示例在$configs['env']设置为开发环境或生产环境时会有不同的表现。

更多的错误相关信息见官方手册错误

往期内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值