PHP OO - 我应该如何处理多个类中的软错误?

时间:2015-06-19 19:13:25

标签: php oop error-handling

如果已经在某个地方得到回答,我很抱歉,但到目前为止我还没有找到答案 - 也许我正在寻找错误的事情!

我试图找出如何处理我的OO PHP系统中的错误,该系统用于生成网页。希望这个例子可以解释我的意思。

想象一下,我有一个Content类,一个Form类和一个FormObject类,它包含有关页面内容,Web表单和表单字段的所有信息。所有类都可以通过DB类运行多个MySQL查询。 用户可以在后端创建新内容或表单。当他们这样做时,我使用类来创建数据并将其存储在数据库中。

我还有一个System类,用于生成网页。 System类检查应该在前端显示的内容,构建适当的Content和Form对象,然后生成HTML并将其输出到屏幕。

我对严重错误进行了一些检查,这会阻止代码继续进行。但问题是,我想反馈一些"软错误"到了前端。例如,也许System类构建一个Form对象,然后使用FormObject类构建字段。 FormObject类在数据库中查询字段名称,但找不到字段名称。所以DB类返回一个错误。我希望能够将消息反馈给前端,该消息表明尚未找到字段名称。

获得该问题的最佳方法是什么?#34;软错误"回到System类的消息,可以输出到前端吗? 我意识到在这个特定的例子中它相当简单,但随着更多的类被添加,并且至关重要的是,添加了更多的级别,问题会变得更大。

我想到这样做的一种方法是拥有一个Error类。系统将创建一个Error对象,并在创建时将其传递给每个Content和Form对象。 Form类将相同的Error对象传递给FormItem类。每当发现错误时,都会通过Error类中的方法记录。然后,系统可以访问原始的Error对象并输出所有错误。但是,随着系统的增长,会添加更多的类,并且会创建更多的对象,这可能会让人感到非常困惑。还有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

您可能想要使用

  1. 所有类都可以访问的全局内容(例如全局变量或Singleton)或
  2. 传递给所有类别实例的内容,产生你所谓的“软错误”
  3. 收集此类错误。然后,您想要使用您收集的任何内容,并以某种方式将其添加到System类的输出中。

    更具体......

    这是使用全局解决方案的示例:

    global $softErrorMessages = array();
    
    class A
    {
      function sampleFunctionA()
      {
        // [...]
        // some code setting $result to some valid value
        // or to false if an error occured
    
        if($result === false) // check for validity
        {
          global $softErrorMessages;
          $softErrorMessages[] = "The sample function A caused a soft error";
          return;
         }
    
        // [...]
        // some code requiring a valid $result
      }
    }
    

    如果您使用此类全局广告,则可以从System班级轻松访问该广告,并将其内容放入输出的正确位置。

    但是,如果执行单元测试,则可能不希望使用全局变量或类似全局的解决方案(如单例)。所以这里是一个错误集合的例子'的方法:

    class ErrorCollector
    {
      private $errors = array();
    
      function addError($error)
      {
        $this->errors[] = $error;
      }
    
      function getErrors()
      {
        return $this->errors;
      }
    }
    
    class A
    {
      private $errorCollector;
    
      function __construct(/* your additional parameters */, ErrorCollector $errorCollector)
      {
        // [...]
        // additional instantiation stuff
    
        $this->errorCollector = $errorCollector;
      }
    
      function sampleFunctionA()
      {
        // [...]
        // some code setting $result to some valid value
        // or to false if an error occured
    
        if($result === false) // check for validity
        {
          $this->errorCollector->addError("The sample function A caused a soft error");
          return;
         }
    
        // [...]
        // some code requiring a valid $result
      }
    
    }
    

    您只需将ErrorCollector实例化一次,然后将其传递给所有其他类实例。然后让你的对象履行职责(并可能向ErrorCollector添加软错误)。完成后,您的System课程会收到所有错误消息,然后再次将它们放在输出的正确位置。

答案 1 :(得分:0)

异常是处理错误的便捷机制。如果DB返回错误,FormObject可以抛出一些SoftErrorException类的异常。然后在System中,您将捕获此异常并将其呈现为前端。

class System {

    public function showFormAction() {

        try {
            $form = ... // create a form
            $this->renderForm($form);
        } catch (SoftErrorException $e) {
            $this->handleSoftError($e);
        }

    }

    public function handleSoftError(SoftErrorException $e)
    {
        // Do whatever you want with exceptions: render it
        // $this->renderErrorPage($e->getMessage());
        // or collect them and show after
        // $this->errors[] = $e;
    }



}