gpt4 book ai didi

PHP - 生产环境的明智/优雅/优雅的错误处理

转载 作者:行者123 更新时间:2023-12-03 08:14:29 30 4
gpt4 key购买 nike

我正在编写一个 PHP Web 应用程序,它将在不久的将来在生产环境下运行,而不是使用非用户友好的 die() , 我想我会想出一个 Class处理错误消息。

基本上,我的思考过程是这样的:

  • 如果 Web 应用程序处于调试/开发模式,die() 就可以了。
  • 如果 Web 应用程序处于生产/实时模式,请不要用错误消息打扰用户 - 而是尽可能继续,但向管理员发送电子邮件,转储错误消息和我们可以做的任何其他事情(例如:登录用户、 session 详情、IP 地址、时间等)

  • 我的(粗略)代码如下:
    <?php
    require_once('config.php');

    class ErrorMessage
    {
    private $myErrorDescription;

    public function __construct($myErrorDescription)
    {
    $this->myErrorDescription = (string) $myErrorDescription;

    if (DEBUG_MODE === true)
    die($myErrorDescription);
    else
    $this->sendEmailToAdministrator();
    }

    private function sendEmailToAdministrator()
    {
    // Send an e-mail to ERROR_LOGGING_EMAIL_ADDRESS with the description of the problem.
    }
    }

    ?>

    这个 Class将用作:
    if (EXPECTED_OUTCOME) {
    // ...
    }
    else {
    new ErrorMessage('Application failed to do XYZ');
    }

    这是一种明智的方法还是我在这里重新发明轮子?我知道框架通常有错误处理的解决方案,但我没有使用(也不想)。

    也就是说,我应该使用 ExceptionsThrow为了这个?这种方法的优点/缺点是什么?

    最佳答案

    我建议使用异常(exception)。

    您可以通过执行以下操作将 php 切换为发送异常而不是错误:( from PHP ErrorException Page )

    <?php
    function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    }
    set_error_handler("exception_error_handler");

    /* Trigger exception */
    strpos();
    ?>

    然后在你的代码中当你遇到错误条件时抛出一个异常
    throw(new Exception("Meaningful Description", "optional error number"));

    可以键入异常,以便您可以派生一个实例,以便您可以将其作为目标
    class MyRecoverableException extends Exception {}

    然后在您的代码中,您可以在 try/catch block 中包含可能引发潜在可恢复错误的代码。
     try {
    $res = doSomething();
    if (!$res) throw new MyRecoverableException("Do Somthing Failed");
    } catch(MyRecoverableException $e){
    logError($e);
    showErrorMessage($e->getMessage());
    }

    这在数据库事务中特别有用
     try {
    $db->beginTransaction();
    // do a lot of selectes and inserts and stuff
    $db->commit();
    } catch (DBException $e){
    $db->rollback();
    logError($e);
    showErrorMessage("I was unable to do the stuff you asked me too");
    }

    打开错误报告后,未捕获的异常将为您提供详细的堆栈跟踪,告诉您异常是在哪里引发的。

    关闭错误报告,您将收到 500 错误。

    关于PHP - 生产环境的明智/优雅/优雅的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17036773/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com