Объекты и обработка ошибок в PHP - PullRequest
1 голос
/ 11 января 2009

Как лучше всего обрабатывать ошибки при использовании объектов?

A) До вызова метода объекта и даже не удается выполнить метод, если есть какая-либо ошибка, или

B) Просто передайте параметры и выполните проверку ошибок в самом методе, возвращая код ошибки или что-то подобное.

Пожалуйста, выберите ваш вариант и краткое описание, почему?

Спасибо orlandu63, это хорошая практика, но как насчет нефатальных ошибок, например, пользователь должен предоставить название для чего-то, а он / она этого не сделал?

class Sample {    

var $err_no_title = 1;

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

Или также использовать исключения для ошибок такого рода?

Ответы [ 2 ]

3 голосов
/ 11 января 2009

Если вы используете OO, вы также можете использовать исключения. Мой ответ - это сочетание 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 имеет недостатки. Таким образом, метод А полностью.

0 голосов
/ 12 января 2009

Для выбора из предложенных вами вариантов это будет B, но не используйте коды ошибок и вместо этого выведите exception Вся логика (даже проверка входов) должна быть заключена в функцию.

Причины:

  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)";
    }
    ...
?>

Во-первых, подобные вещи должны быть проверены в пользовательском интерфейсе. Так что это будет А, но Б должен быть там, чтобы. Таким образом, окончательный вердикт будет: оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...