1

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

A)在对象的方法被调用之前,如果有一些错误,甚至没有执行方法,或者

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

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

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

class Sample {    

var $err_no_title = 1;

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

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

4

2 回答 2

3

如果您使用的是 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一直。

于 2009-01-11T20:47:43.157 回答
0

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

原因是:

  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需要在那里。所以最终的判决是:两者兼而有之。

于 2009-01-11T21:03:58.663 回答