php错误报告

时间:2009-10-27 18:25:12

标签: php oop reporting

您的班级功能是否有报告错误的通用标准?

我已经看到了一些你传递错误字符串的c函数,所以如果有错误你可以看到它在字符串中的含义,你需要指针。

我不愿意使用return,因为有时你确实需要返回其他变量。

我尝试的一件事是使用标准化的返回对象,里面有错误键以及数据。这似乎工作正常,但在与其他类一起使用时,似乎有点笨拙。

所以这是我的最新想法,该类有一个内部变量$ error,每次调用一个函数时,$ error被清除,并使用错误字符串或数组更新(甚至可能包含多个错误),当函数完成后我们可以检查错误是否为空。

这就是问题所在,如果我在函数中使用函数,我最终会清除错误。我可以将字符串保存在不同的var中,并且只有在返回之前将其推送到错误。

任何其他想法,优雅可靠地做到这一点?

3 个答案:

答案 0 :(得分:4)

这是一个经过深思熟虑的话题,没有一个真正的答案。

但这是我熟悉的四种最常见的模式

  1. 例外
  2. 多个返回值/错误代码
  3. 错误参数
  4. 错误状态
  5. 每个

    的快速示例

    例外

    function doSomething()
    {
      if ( /* expression */ )
      {
        throw new Exception( 'something went wrong' );  
      }
    }
    
    //  Let the registered exception handler do the work
    doSomething();
    
    //  Or handle this call specifically
    try {
      doSomething();
    }
    catch ( Exception $e )
    {
      echo $e->getMessage();
    }
    

    错误代码

    function doSomething()
    {
      if ( /* expression #1 */ )
      {
        return -1;
      }
    
      if ( /* expression #2 */ )
      {
        return -2;
      }
      return 1;
    }
    
    $return = doSomething();
    
    switch ( $return )
    {
      case -1;
        echo 'Error #1 Found';
        break;
      case -2;
        echo 'Error #2 Found';
        break;
      default:
        echo 'Success';
    }
    

    错误参数

    function doSomething( &$error )
    {
      if ( /* expression #1 */ )
      {
        $error = 'Something went wrong';
      }
    }
    
    $error = false;
    
    doSomething( $error );
    
    if ( $error )
    {
      echo $error;
    }
    

    错误状态

    class Foo
    {
      private $error = false;
      private $errorMsg;
    
      public function doSomething()
      {
        if ( /* expression */ )
        {
          $this->setError( 'Something went wrong' );
        }
      }
    
      public function isError()
      {
        return $this->error;
      }
    
      public function getErrorMsg()
      {
        return $this->errorMsg;
      }
    
      private function setError( $message )
      {
        $this->error = true;
        $this->errorMsg = $message;
      }
    }
    
    $f = new Foo();
    $f->doSomething();
    
    if ( $f->isError() )
    {
      echo $f->getErrorMsg();
    }
    

    在为项目选择系统(或系统组合)之前,您需要权衡每个系统的优缺点。

答案 1 :(得分:1)

没有共同的标准。解决方案完全取决于您的特定需求。

答案 2 :(得分:0)

考虑学习和使用exceptions。它们不是通用的解决方案,但如果使用得当,将使您的代码更具可读性和可理解性。