红茶的个人站点

  • 首页
  • 专栏
  • 开发工具
  • 其它
  • 隐私政策
Awalon
Talk is cheap,show me the code.
  1. 首页
  2. 编程语言
  3. PHP
  4. 正文

PHP学习笔记16:错误处理

2021年12月10日 1254点热度 0人点赞 0条评论

image-20211129162010327

图源:php.net

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

一般来说,基本原则是在开发环境严格检查错误,并将错误直接输出,这样有利于快速排查错误。而生产和预生产环境需要将错误输出从标准输出屏蔽,因为输出的错误信息可能包含一些敏感信息,这些信息被用户获知可能会影响到系统安全。此外一些不影响系统正常运行的错误信息,比如E_NOTICE和E_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']设置为开发环境或生产环境时会有不同的表现。

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

往期内容

  • PHP学习笔记15:枚举

  • PHP学习笔记14:命名空间

  • PHP学习笔记13:类和对象 V

  • PHP学习笔记12:类和对象IV

  • PHP学习笔记11:类和对象 III

  • PHP学习笔记10:类和对象 II

  • PHP学习笔记9:类和对象 I

  • PHP学习笔记8:函数

  • PHP学习笔记7:控制流

  • PHP学习笔记6:表达式和运算符

  • PHP学习笔记5:常量

  • PHP学习笔记4:变量

  • PHP学习笔记3:其它类型和类型声明

  • PHP学习笔记2:数组

  • PHP学习笔记1:基础

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2021年12月10日

魔芋红茶

加一点PHP,加一点Go,加一点Python......

点赞
< 上一篇
下一篇 >

文章评论

取消回复

*

code

COPYRIGHT © 2021 icexmoon.cn. ALL RIGHTS RESERVED.
本网站由提供CDN加速/云存储服务

Theme Kratos Made By Seaton Jiang

宁ICP备2021001508号

宁公网安备64040202000141号