0

我正在编写一个 PHP Web 应用程序,它将在不久的将来在生产环境下运行,而不是使用 non-user-friendly die(),我想我会想出一个Class处理 ErrorMessages 的方法。

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

  1. 如果 Web 应用程序处于调试/开发模式,die() 就可以了。

  2. 如果 Web 应用程序处于生产/实时模式,请不要用错误消息打扰用户 - 而是尽可能继续,但向管理员发送电子邮件,转储错误消息和我们可以做的任何其他事情(例如:登录用户、会话详细信息、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');
}

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

也就是说,我应该使用ExceptionsandThrow来代替它吗?这种方法的优点/缺点是什么?

4

1 回答 1

2

我建议使用例外。

您可以通过执行以下操作将 php 切换为发送异常而不是错误:(来自 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 块中包含可能引发潜在可恢复错误的代码。

 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 错误。

于 2013-06-11T05:34:07.057 回答