「PHP系列」PHP Error(错误处理)讲解

文章目录

  • 一、使用 die() 函数,处理错误
  • 二、自定义错误处理器
  • 三、错误报告级别
  • 四、异常处理
  • 五、错误日志
    • 1. 配置 PHP 错误日志
    • 2. 记录错误到日志
    • 3. 案例代码
  • 六、相关链接

一、使用 die() 函数,处理错误

在 PHP 中,die() 函数是一个简单而直接的方式来处理错误并终止脚本的执行。当调用 die() 函数时,它会输出一条消息并立即退出脚本。这通常用于在发生致命错误时向用户显示一条错误消息,并阻止脚本继续执行。

die() 函数实际上是 exit() 函数的别名,它们的功能是相同的。你可以使用其中任何一个来达到相同的效果。

使用 die() 函数进行基本错误处理的示例:

<?php
// 假设我们有一个函数,它可能会因为某些条件而失败
function divideNumbers($a, $b) {
    if ($b == 0) {
        die("错误:除数不能为零"); // 如果除数为零,输出错误消息并终止脚本
    }
    return $a / $b;
}

// 使用函数并捕获可能的错误
$result = divideNumbers(10, 0); // 这会触发 die() 函数并输出错误消息

// 下面的代码不会执行,因为 die() 已经终止了脚本
echo "结果是:$result";
?>

在上面的示例中,divideNumbers() 函数检查除数是否为零。如果是,它调用 die() 函数并输出一条错误消息。由于 die() 会立即终止脚本的执行,因此后面的 echo 语句不会被执行。

二、自定义错误处理器

在 PHP 中,你可以通过 set_error_handler() 函数来创建自定义的错误处理器。这个函数允许你指定一个自定义的函数来处理脚本执行期间发生的错误。当发生错误时,PHP 会调用你指定的函数,并将错误信息作为参数传递给它。

创建自定义错误处理器的示例:

<?php
// 自定义错误处理函数
function customErrorHandler($errno, $errstr, $errfile, $errline) {
    // 根据错误级别来决定如何处理错误
    switch ($errno) {
        case E_USER_ERROR:
            echo "<b>PHP 用户错误</b> [$errno] $errstr<br />\n";
            echo "  Fatal error on line $errline in file $errfile";
            echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
            exit(1); // 退出脚本
            break;

        case E_USER_WARNING:
            echo "<b>PHP 用户警告</b> [$errno] $errstr<br />\n";
            break;

        case E_USER_NOTICE:
            echo "<b>PHP 用户通知</b> [$errno] $errstr<br />\n";
            break;

        default:
            echo "未知错误类型: [$errno] $errstr<br />\n";
            break;
    }

    /* 不要忘记,错误处理函数必须返回 FALSE,
       这样标准 PHP 错误处理函数就不会再执行了 */
    return false;
}

// 设置自定义错误处理函数
set_error_handler("customErrorHandler");

// 触发一个用户级别的错误
trigger_error("这是一个用户级别的错误", E_USER_ERROR);

// 这里的代码不会执行,因为上面的 trigger_error 调用会导致脚本退出
echo "脚本继续执行...";
?>

在上面的示例中,customErrorHandler() 函数根据错误的级别执行不同的操作。当触发一个用户级别的错误时(通过 trigger_error() 函数),自定义错误处理器会被调用,并显示一条相应的错误消息。如果错误级别是 E_USER_ERROR,处理器还会通过 exit(1) 终止脚本的执行。
语法

error_function(error_level,error_message,error_file,error_line,error_context)

属性

参数描述
error_level必需。为用户定义的错误规定错误报告级别。必须是一个数字。参见下面的表格:错误报告级别。
error_message必需。为用户定义的错误规定错误消息。
error_file可选。规定错误发生的文件名。
error_line可选。规定错误发生的行号。
error_context可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。

三、错误报告级别

语法

error_reporting(E_ALL & ~E_NOTICE); // 显示所有错误,除了 NOTICE 级别的错误

属性

常量描述
2E_WARNING非致命的 run-time 错误。不暂停脚本执行。
8E_NOTICErun-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。
256E_USER_ERROR致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。
512E_USER_WARNING非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。
1024E_USER_NOTICE用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
4096E_RECOVERABLE_ERROR可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
8191E_ALL所有错误和警告。(在 PHP 5.4 中,E_STRICT 成为 E_ALL 的一部分)

四、异常处理

在 PHP 中,异常处理是一种错误处理机制,它允许程序在运行时遇到异常情况时,能够以一种结构化的方式来处理这些异常,而不是简单地终止执行。异常处理通过使用 trycatchfinally 语句块来实现。

当在 try 语句块中的代码抛出异常时,控制流会立即转移到相应的 catch 语句块中。catch 语句块用于处理特定的异常类型。finally 语句块是可选的,无论是否发生异常,它都会在执行完 trycatch 块后执行。

PHP 异常处理案例代码:

<?php

// 定义一个自定义的异常类
class CustomException extends Exception {
    // 重新定义构造函数
    public function __construct($message, $code = 0, Exception $previous = null) {
        parent::__construct($message, $code, $previous);
    }

    // 自定义的字符串输出的异常
    public function __toString() {
        return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
    }

    // 自定义的错误处理
    public function customFunction() {
        echo "Custom Exception Function called!" . PHP_EOL;
    }
}

try {
    // 可能会抛出异常的代码
    if (false) {
        // 故意制造一个异常,实际情况中可能是某种条件不满足
        throw new CustomException('发生了一个自定义异常');
    }
    
    // 其他正常执行的代码...
    echo "没有异常发生,继续执行..." . PHP_EOL;
} catch (CustomException $e) {
    // 处理 CustomException 类型的异常
    echo '捕获到异常:' . $e->getMessage() . PHP_EOL;
    $e->customFunction();
} catch (Exception $e) {
    // 处理其他类型的异常
    echo '捕获到未指定的异常:' . $e->getMessage() . PHP_EOL;
} finally {
    // 无论是否发生异常,这段代码都会执行
    echo "finally 代码块执行..." . PHP_EOL;
}

echo "脚本继续执行..." . PHP_EOL;
?>

在这个例子中,我们定义了一个名为 CustomException 的自定义异常类,它继承自 PHP 内置的 Exception 类。我们在 try 语句块中故意制造了一个异常(throw new CustomException('发生了一个自定义异常');),然后使用 catch 语句块来捕获并处理这个异常。如果 try 语句块中的代码没有抛出异常,那么 catch 语句块将不会被执行,而 finally 语句块则会无论如何都会被执行。

五、错误日志

在 PHP 中,错误日志是记录 PHP 脚本执行期间发生的错误和警告的重要工具。PHP 提供了多种方式来配置和管理错误日志。

1. 配置 PHP 错误日志

首先,你需要在 php.ini 配置文件中设置错误日志的路径。找到 error_log 配置项并设置为你想要存储错误日志的文件路径。例如:

error_log = /var/log/php/error.log

然后,你需要配置错误报告级别。同样在 php.ini 文件中找到 error_reporting 并设置适当的值。例如,要报告所有错误(除了 E_STRICT),你可以这样设置:

error_reporting = E_ALL & ~E_STRICT

或者,你可以在运行时通过 error_reporting() 函数来设置错误报告级别:

error_reporting(E_ALL & ~E_STRICT);

2. 记录错误到日志

PHP 的默认行为是将错误记录到 web 服务器的错误日志中(如 Apache 的 error_log),但你也可以通过 error_log() 函数将错误记录到自定义的日志文件中。

<?php
// 将一条错误消息记录到 PHP 错误日志中
error_log("这是一个自定义错误消息");

// 你也可以指定一个自定义的错误日志文件
error_log("这是一个自定义错误消息", 3, "/path/to/your/custom-error.log");
?>

在这个例子中,error_log() 函数的第二个参数是消息类型,通常设置为 3 表示将其作为一个错误消息。第三个参数是自定义错误日志文件的路径。

3. 案例代码

一个简单的 PHP 脚本示例,它故意制造一个错误,并将该错误记录到自定义的错误日志文件中:

<?php
// 设置自定义错误日志文件路径
$customErrorLog = '/path/to/your/custom-error.log';

// 设置错误报告级别为报告所有错误
error_reporting(E_ALL);

// 设置错误处理函数
set_error_handler(function($errno, $errstr, $errfile, $errline) use ($customErrorLog) {
    // 将错误记录到自定义日志文件
    error_log("[$errno] $errstr in $errfile on line $errline", 3, $customErrorLog);
    
    // 根据需要决定是否终止脚本执行
    // 如果需要终止执行,可以使用 exit();
});

// 故意制造一个错误
trigger_error("这是一个触发的错误", E_USER_ERROR);

// 其他正常执行的代码...
echo "脚本继续执行..." . PHP_EOL;
?>

在这个例子中,我们使用了 set_error_handler() 函数来设置一个自定义的错误处理函数。当脚本中发生错误时,这个处理函数会被调用,并将错误信息记录到指定的自定义错误日志文件中。同时,我们使用了 trigger_error() 函数来故意触发一个错误。

六、相关链接

  1. php官网
  2. php_Github
  3. PHP实现Token
  4. 「PHP系列」PHP简介与起步
  5. 「PHP系列」PHP语法介绍
  6. 「PHP系列」PHP变量
  7. 「PHP系列」PHP echo/print语句、数据类型详解
  8. 「PHP系列」PHP 常量/字符串、类型比较
  9. 「PHP系列」PHP 运算符详解
  10. 「PHP系列」If…Else语句/switch语句
  11. 「PHP系列」数组详解
  12. 「PHP系列」PHP数组排序及运用场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/575189.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++11 数据结构7 队列的链式存储,实现,测试

前期考虑 队列是两边都有开口&#xff0c;那么在链式情况下&#xff0c;线性表的链式那一边作为对头好呢&#xff1f; 从线性表的核心的插入和删除算法来看&#xff0c;如果在线性表链表的头部插入&#xff0c;每次循环都不会走&#xff0c;但是删除的时候&#xff0c;要删除线…

回归与聚类——K-Means(六)

什么是无监督学习 一家广告平台需要根据相似的人口学特征和购买习惯将美国人口分成不同的小 组&#xff0c;以便广告客户可以通过有关联的广告接触到他们的目标客户。Airbnb 需要将自己的房屋清单分组成不同的社区&#xff0c;以便用户能更轻松地查阅这些清单。一个数据科学团队…

Python爱心代码

爱心效果图&#xff1a; 完整代码&#xff1a; import random from math import sin, cos, pi, log from tkinter import *# 定义画布尺寸和颜色 CANVAS_WIDTH 640 CANVAS_HEIGHT 480 CANVAS_CENTER_X CANVAS_WIDTH / 2 CANVAS_CENTER_Y CANVAS_HEIGHT / 2 IMAGE_ENLARG…

C#实现TFTP客户端

1、文件结构 2、TftpConfig.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace TftpTest {public class TftpConfig{}/// <summary>/// 模式/// </summary>public enum Modes{…

大模型都在用的:旋转位置编码

写在前面 这篇文章提到了绝对位置编码和相对位置编码&#xff0c;但是他们都有局限性&#xff0c;比如绝对位置编码不能直接表征token的相对位置关系&#xff1b;相对位置编码过于复杂&#xff0c;影响效率。于是诞生了一种用绝对位置编码的方式实现相对位置编码的编码方式——…

LS2K1000LA基础教程

基于LS2K1000LA的基础教程 by 南京工业大学 孙冬梅 于 2024.4.25 文章目录 基于LS2K1000LA的基础教程一、目的二、平台1.硬件平台2.软件平台 三、测试0.开发板开机及编译器配置0.1 开发板控制台0.2 虚拟机编译器配置 1. 简单应用编程1.helloworld.c2. fileio 文件操作3.proce…

Scrapy 爬虫教程:从原理到实战

Scrapy 爬虫教程&#xff1a;从原理到实战 一、Scrapy框架简介 Scrapy是一个由Python开发的高效网络爬虫框架&#xff0c;用于从网站上抓取数据并提取结构化信息。它采用异步IO处理请求&#xff0c;能够同时发送多个请求&#xff0c;极大地提高了爬虫效率。 二、Scrapy运行原…

入坑 Java

原文&#xff1a;https://blog.iyatt.com/?p11305 前言 今天&#xff08;2023.8.31&#xff09;有个学长问我接不接一个单子&#xff0c;奈何没学过 Java&#xff0c;本来不打算接的。只是报酬感觉还不错&#xff0c;就接了。 要求的完成时间是在10月初&#xff0c;总共有一…

Spring Boost + Elasticsearch 实现检索查询

需求&#xff1a;对“昵称”进行“全文检索查询”&#xff0c;对“账号”进行“精确查询”。 认识 Elasticsearch 1. ES 的倒排索引 正向索引 对 id 进行检索速度很快。对其他字段即使加了索引&#xff0c;只能满足精确查询。模糊查询时&#xff0c;逐条数据扫描&#xff0c…

编译原理实验课

本人没咋学编译原理&#xff0c;能力有限&#xff0c;写的不好轻点喷&#xff0c;大佬路过的话&#xff0c;那你就路过就好 东大编译原理实验课原题&#xff0c;22年 1. 基本题&#xff1a;简单的扫描器设计 【问题描述】 熟悉并实现一个简单的扫描器&#xff0c;设计扫描器…

C++ | Leetcode C++题解之第49题字母异位词分组

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 自定义对 array<int, 26> 类型的哈希函数auto arrayHash [fn hash<int>{}] (const array<int, 26>&…

黑马点评(十二) -- UV统计

一 . UV统计-HyperLogLog 首先我们搞懂两个概念&#xff1a; UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站&#xff0c;只记录1次。 PV&#xff1a;全称Page View&…

linux权限维持(四)

6.inetd服务后门 inetd 是一个监听外部网络请求 ( 就是一个 socket) 的系统守护进程&#xff0c;默认情况下为 13 端口。当 inetd 接收到 一个外部请求后&#xff0c;它会根据这个请求到自己的配置文件中去找到实际处理它的程序&#xff0c;然后再把接收到的 这个socket 交给那…

机器学习 -- 分类问题

场景 探讨了一个回归任务——预测住房价格&#xff0c;用到了线性回归、决策树以及随机森林等各种算法。本次中我们将把注意力转向分类系统。我们曾经对MNIST进行了分类任务&#xff0c;这次我们重新回到这里&#xff0c;细致的再来一次。 开始 获取数据 Scikit-Learn提供了…

力扣爆刷第127天之动态规划五连刷(整数拆分、一和零、背包)

力扣爆刷第127天之动态规划五连刷&#xff08;整数拆分、一和零、背包&#xff09; 文章目录 力扣爆刷第127天之动态规划五连刷&#xff08;整数拆分、一和零、背包&#xff09;关于0 1 背包问题的总结01背包遍历顺序&#xff1a;完全背包遍历顺序&#xff1a; 一、343. 整数拆…

Lock-It for Mac(应用程序加密工具)

OSXBytes Lock-It for Mac是一款功能强大的应用程序加密工具&#xff0c;专为Mac用户设计。该软件具有多种功能&#xff0c;旨在保护用户的隐私和数据安全。 Lock-It for Mac v1.3.0激活版下载 首先&#xff0c;Lock-It for Mac能够完全隐藏应用程序&#xff0c;使其不易被他人…

【Pytorch】(十四)C++ 加载TorchScript 模型

文章目录 &#xff08;十四&#xff09;C 加载TorchScript 模型Step 1: 将PyTorch模型转换为TorchScriptStep 2: 将TorchScript序列化为文件Step 3: C程序中加载TorchScript模型Step 4: C程序中运行TorchScript模型 【Pytorch】&#xff08;十三&#xff09;PyTorch模型部署: T…

平衡二叉树、红黑树、B树、B+树

Tree 1、前言2、平衡二叉树和红黑树3、B树和B树3.1、B树的构建3.2、B树和B树的区别3.3、数据的存储方式 1、前言 本文侧重在理论方面对平衡二叉树、红黑树、B树和B树的各方面性能进行比较。不涉及编程方面的实现。而关于于平衡二叉树在C中的实现&#xff0c;我的上一篇文章平衡…

Nginx基本使用 反向代理与负载均衡

什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器。 其特点是占有内存少&#xff0c;并发能力强&#xff0c;nginx的并发能力在同类型的网页服务器中表现较好&#xff0c;而且几乎可以做到7*24不间断运行&#xff0c;即使运行数个月也不需要重新启动。 …

操作系统安全:Linux安全审计,Linux日志详解

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…