Почему я должен использовать обработку исключений в php? - PullRequest
8 голосов
/ 30 июня 2011

Я давно программирую на PHP, но не так много на PHP 5 ... Я знал об обработке исключений в PHP 5 уже некоторое время, но никогда не задумывался над этим. После быстрого Google, кажется, что бессмысленно использовать обработку исключений - я не вижу преимуществ в использовании этого по сравнению с просто использованием некоторых операторов if () {} и, возможно, моего собственного класса обработки ошибок или чего-то еще.

Должно быть множество веских причин для его использования (я думаю ?!), иначе это не было бы введено в язык (вероятно). Может кто-нибудь сказать мне о некоторых хороших преимуществах по сравнению с использованием нескольких операторов if, оператора switch или чего-то еще?

Ответы [ 9 ]

6 голосов
/ 30 июня 2011

Исключения позволяют различать разные типы ошибок, а также отлично подходят для маршрутизации. Например ...

class Application
{
    public function run()
    {
        try {
            // Start her up!!
        } catch (Exception $e) {
            // If Ajax request, send back status and message
            if ($this->getRequest()->isAjax()) {
                return Application_Json::encode(array(
                    'status' => 'error',
                    'msg'    => $e->getMessage());
            }

            // ...otherwise, just throw error
            throw $e;
        }
    }
}

После этого выброшенное исключение может быть обработано пользовательским обработчиком ошибок.

Поскольку PHP является свободно типизированным языком, вам может потребоваться, чтобы в качестве аргументов метода класса передавались только строки. Например ...

class StringsOnly
{
    public function onlyPassStringToThisMethod($string)
    {
        if (!is_string($string)) {
            throw new InvalidArgumentException('$string is definitely not a string');
        }

        // Cool string manipulation...

        return $this;
    }
}

... или если вам нужно по-разному обрабатывать различные типы исключений.

class DifferentExceptionsForDifferentFolks
{
    public function catchMeIfYouCan()
    {
        try {
            $this->flyForFree();
        } catch (CantFlyForFreeException $e) {
            $this->alertAuthorities();
            return 'Sorry, you can\'t fly for free dude. It just don\'t work that way!';
        } catch (DbException $e) {
            // Get DB debug info
            $this->logDbDebugInfo();
            return 'Could not access database. What did you mess up this time?';
        } catch (Exception $e) {
            $this->logMiscException($e);
            return 'I catch all exceptions for which you did not account!';
        }
    }
}

Если вы используете транзакции в чем-то вроде Zend Framework:

class CreditCardController extends Zend_Controller_Action
{
    public function buyforgirlfriendAction()
    {
        try {
            $this->getDb()->beginTransaction();

            $this->insertGift($giftName, $giftPrice, $giftWowFactor);

            $this->getDb()->commit();
        } catch (Exception $e) {
            // Error encountered, rollback changes
            $this->getDb()->rollBack();

            // Re-throw exception, allow ErrorController forward
            throw $e;
        }
    }
}
3 голосов
/ 30 июня 2011

Обработка исключений: если условие и исключение не являются специфическими для PHP, но дают хорошую перспективу.Лично Exception и try / catch реализованы на языках для обеспечения хорошего поведения среди разработчиков, которые обычно не будут так внимательны к проверке / обработке ошибок.

Если вы уверены, что ваш if / else if / else перехватывает все сценарии, тогда круто.

Вот обзор Преимущества исключений - Java - В какой-то момент есть фрагмент кода, который имеет много операторов if / else и следующую выдержку:

Здесь обнаруживается так много ошибок, сообщений и их возвратов, что оригинальные семь строк кода теряются в беспорядке.Что еще хуже, логический поток кода также был утерян, что затрудняет определение правильности выполнения кода: действительно ли файл закрывается, если функции не удается выделить достаточно памяти?Еще труднее гарантировать, что код продолжает работать правильно, когда вы модифицируете метод через три месяца после его написания.Многие программисты решают эту проблему, просто игнорируя ее - об ошибках сообщают, когда их программы терпят крах.

Так что в действительности все сводится к личным предпочтениям.Если вам нужен код, который читается и может быть использован другими людьми, это, как правило, лучший подход, обеспечивающий лучшее поведение

2 голосов
/ 30 июня 2011

Мы используем обработку исключений, если не уверены в результатах кода.Мы помещаем этот фрагмент кода в блок try и фиксируем эту ошибку в блоке catch.Пожалуйста, проверьте эту ссылку для получения дополнительной информации.

2 голосов
/ 30 июня 2011

Если вы следуете объектно-ориентированной методологии, то исключения будут полезны для обработки ошибок.Удобно сообщать об ошибках через исключения между объектами.Исключения действительно полезны, если вы используете многоуровневый подход к дизайну.

Если вы не программируете объектно-ориентированным способом, исключения не требуются.

1 голос
/ 30 июня 2011

Как правило, есть две веские причины использовать обработку исключений:

  1. Теперь вы всегда можете знать, где произойдет исключение - может произойти что-то неожиданное.Если вы используете глобальный обработчик исключений, вы можете быть уверены, что независимо от того, что пойдет не так, у вашей программы есть шанс на восстановление.Точно так же особенно чувствительный кусок кода (например, что-то, что выполняет ввод-вывод) может иметь всевозможные ошибки, которые могут быть обнаружены только во время выполнения, и вы хотите отловить любые возможные непредвиденные обстоятельства.Некоторые вещи могут не произойти во время тестирования;что делать, если сервер вне вашего контроля выходит из строя?Это никогда не может быть проверено до того, как это действительно произойдет (хотя хорошее тестирование будет включать это).Это действительно более важная причина.

  2. Производительность.Обычно исключения реализуются так, что все быстро, пока ничего не происходит неправильно.Исключения ловятся после того, как они происходят.Это означает, что никакое выражение «если» не должно оцениваться заранее, если что-то идет не так, и в этом случае накладные расходы очень низкие.Если вы не используете исключения, вы будете вынуждены добавить в свой код множество операторов if.Хотя обычно это не представляет большой проблемы, это может привести к остановке приложения, критичного к производительности.Это особенно верно, потому что неправильное предсказание ветвления в ЦП может вызвать сброс конвейера.

0 голосов
/ 25 сентября 2015

Исключения трудно использовать в правильном контексте, особенно в php. Лично я использую исключения, когда эти 3 вещи случаются:

Исключение из-за сбоя ресурса - Вы можете выдать исключение, возможно, когда вашей программе не хватает памяти. например, в php, когда вы запускаете скрипт, выполнение которого превышает 30 секунд. Хотя вы можете изменить это в .ini

Исключения ошибок клиентского кода - Например, при попытке подключиться к базе данных с неверными учетными данными или отсоединении файла, отсутствующего на сервере. Или, когда сервер базы данных не работает и не отвечает, вы можете выдать исключение.

Исключение ошибки программиста - Это ошибки, сгенерированные из-за ваших собственных проблем с кодированием. Это также можно использовать, когда вы не уверены в результатах, которые даст вам ваш код. например, при делении на 0.

0 голосов
/ 30 июня 2011
  1. Исключения могут предоставить гораздо больше данных, чем простые -1 или false.
  2. Исключения могут выполнять расширенную обработку ошибок.Помните, что блоки try .. catch могут быть вложенными и в блоке try .. catch может быть более одного блока catch.
  3. Исключения вынуждают вас обрабатывать ошибки.Когда вы их не используете, вы делаете что-то вроде:

    function doSomething($a, $b, $c) {
        ...
    
        if ($a < $b && $b > $c) {
            return -1; // error
        }
    
        ...
    }
    
    $d = doSomething($x, $y, $z);
    
    if ($d === -1) {
        die('Fatal error!');
    }
    

    И все в порядке, если вы не забыли проверить, вернула ли функция ошибку.Но что произойдет, если вы забыли это проверить?На самом деле это довольно распространенная проблема.

  4. Исключения делают ход программы намного более естественным.

0 голосов
/ 30 июня 2011

Одна из основных причин наличия структуры исключений заключается в том, что если код когда-либо достигает точки, в которой он не может продолжить работу, он может сообщить окружающему контексту, что что-то пошло не так.Это означает, что если у меня есть класс Foo, которому нужно, чтобы $fooInstance->setBarHandler($barHandler) был вызван до того, как $fooInstance->doFoo(); сможет успешно выполнить, класс может предоставить сообщение в более широкий контекст, вместо того чтобы молча завершиться с ошибкой и вернуть FALSE.Кроме того, он позволяет контексту сказать: «Ха. Это сломалось. Что ж, теперь я могу сообщить пользователю / logs / что-то еще, что случилось что-то плохое, и я могу решить, нужно ли мне продолжать пыхтеть».

0 голосов
/ 30 июня 2011

По той причине, что Exception вызывается после trigger_error (); функция, и вы можете отправить также некоторую дополнительную информацию для этого исключения = лучше отладки?

Я не уверен, но я думаю, что это все

Пример:

класс дБ { функция connect () { mysql_Connect ("lolcalhost", "root", "pass :)") или trigger_error ("Test"); } } пытаться { } поймать (дБ

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