【问题标题】:Objects and error handling in PHPPHP 中的对象和错误处理
【发布时间】:2009-01-11 20:39:47
【问题描述】:

如果使用对象,处理错误的最佳做法是什么?

A) 在对象的方法被调用之前,如果出现错误甚至无法执行方法,或者

B)只需传递参数并在方法本身中执行错误检查,返回错误代码或其他内容。

请选择您的选项和简短描述,为什么?

感谢 orlandu63,这是一个很好的做法,但非致命错误怎么办,例如用户应该为某事提供标题,而他/她没有?

class Sample {    

var $err_no_title = 1;

function createNewRecord ($title) {
       if (!$title) return $this->err_no_title;
    }
}

或者对这类错误也使用异常?

【问题讨论】:

  • 使用 orlandu63 回答如果错误不是致命的,您只是不退出脚本,只需以某种方式处理错误,例如尝试 { $db->connect($user, $pass, $db); catch (DatabaseConnectionException $e) { echo '我无法连接到数据库:' . $e; }

标签: php object


【解决方案1】:

如果您使用的是 OO,那么您不妨使用 Exceptions。我的答案是 A 和 B 的混合:

class DatabaseConnectionException extends Exception {}

class Database {
    public function connect($user, $pass, $db) {
        //Connection stuff.
        if($baduser) {
            throw new DatabaseConnectionException('Username (' . $user. ') is invalid.')
         }
         if($badpass) {
             //''
         }
    }
}

$db = new Database;
try {
    $db->connect($user, $pass, $db);
catch (DatabaseConnectionException $e) {
    die('I cannot connect to the database:' . $e);
}

这样做有什么好处?我不知道,但它似乎是正确的。

您可以在 http://php.net/exceptions 和 google 上阅读更多信息。

关于你的第二部分,

首先,您的示例会将其视为错误而不是“警告”,因为您退出了函数,因此如果您没有标题,则不会创建记录。这表明方法 B 是有缺陷的。所以方法 A 一路走来。

【讨论】:

  • 您甚至不需要使用纯面向对象来从 PHP 中的异常中受益。
【解决方案2】:

要从您提供的选项中进行选择,它将是 B,但不要使用错误代码并改为抛出 exceptions。所有的逻辑(甚至输入的验证)都应该封装在函数中。

原因是:

  1. 功能可能会改变,因此可能会改变输入要求。
  2. 函数的用户可能并不总是知道输入应该是什么样的。
  3. 您肯定不想在使用该函数的任何地方重复验证代码。

但要小心,因为异常仅由面向对象的代码引发。例如,此代码不会引发异常:

<?php  
  $number = $number / 0;
?>

你的例子是这样的:

<?php
    class Sample {    
      function createNewRecord ($title) {
       if (!$title) throw new Exception('Title required');
      }
    }

    ...
    try {
      $mysample->createNewRecord($title);
    } catch ($ex) {
      echo "Could not create record. Please try again. (Reason: $ex)";
    }
    ...
?>

首先,这类事情应该在用户界面中进行验证。所以它会是A,但B需要在那里。所以最终的判决是:两者兼而有之。

【讨论】:

  • 但这不再是“警告”,而是错误。您将无法创建没有标题的新记录,而这正是提问者想要的。
猜你喜欢
  • 2013-01-23
  • 1970-01-01
  • 2012-09-15
  • 2023-03-23
  • 2012-03-09
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多