当前位置:   article > 正文

「PHP系列」PHP Error(错误处理)讲解_php 内置error

php 内置error

一、使用 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";
?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在上面的示例中,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 "脚本继续执行...";
?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

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

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

属性

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

三、错误报告级别

语法

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

属性

常量描述
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;
?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

在这个例子中,我们定义了一个名为 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
  • 1

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

error_reporting = E_ALL & ~E_STRICT
  • 1

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

error_reporting(E_ALL & ~E_STRICT);
  • 1

2. 记录错误到日志

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

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

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

在这个例子中,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;
?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这个例子中,我们使用了 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数组排序及运用场景
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/609939
推荐阅读
相关标签
  

闽ICP备14008679号