Когда использовать блоки Try Catch



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




когда я должен использовать блоки try-catch для улучшения моего приложения?




Я читал, что кто-то говорит, что мы должны использовать блоки try-catch только для предотвращения фатальных ошибок.
Я читал, что кто-то еще говорит, что мы должны использовать его только при неожиданных ошибках (подождите, что? неожиданно? если они являются неожиданными ошибками, как могу ли я предотвратить их с помощью try-catch? должен ли я поместить весь свой код приложения в блок try?).
Другие просто говорят, что блоки try-catch должны использоваться везде, потому что они также могут быть расширены (расширение класса исключений).
Наконец кто-то говорит, что PHP try-catch block совершенно бесполезны, потому что они очень плохо реализованы. (На этом я нашел хороший так вопрос о производительности).



Мне кажется, что эта тема очень странная и запутанная. Может кто-нибудь зажжет меня вверх?

658   7  

7 ответов:

Мне кажется, что эта тема очень странная и запутанная. Может кто-нибудь зажечь меня?

наверняка. Я не пользователь PHP, но у меня может быть немного понимания после работы с try/catch в ActionScript, Java и JavaScript. Имейте в виду, однако, что разные языки и платформы поощряют различные виды использования для try/catch. То, что сказал...

единственный раз, когда я бы рекомендовал использовать try / catch, если вы используете родной язык функция

  1. может выдать ошибку / исключение
  2. не дает вам никаких инструментов, чтобы определить, собираетесь ли вы сделать что-то глупое, что вызовет эту ошибку/исключение. например: в ActionScript закрытие загрузчика, который не открыт, приведет к ошибке, но у загрузчика нет свойства isOpen для проверки, поэтому вы вынуждены обернуть его в try/catch, чтобы заставить замолчать в противном случае совершенно бессмысленную ошибку.
  3. ошибки/исключения действительно это бессмысленно.

давайте возьмем примеры, которые вы перечисляете, и посмотрим, как они согласуются с этим списком.

Я читал, что кто-то говорит, что мы должны использовать блоки try-catch только для предотвращения фатальных ошибок.

в случае загрузчика AS.закрыть() функция, это хороший совет. Это фатальная ошибка, и все с банальной оплошности. С другой стороны, практически все ошибки в AS приведут к остановке вашего приложения. Вы затем оберните их все в try / catch? Ни в коем случае! "Роковая ошибка" неустранимая причина. Это означает, что произошло что-то ужасно неправильное, и для приложения продолжать работу в потенциально "неопределенном" состоянии безрассудно. Лучше знать, что произошла ошибка, а затем исправить ее, а не просто отпустить.

Я читал, что кто-то еще говорит, что мы должны использовать его только при неожиданных ошибках

Это еще хуже. Это, скорее всего, ошибки, которые вы Не хочу молчать, потому что молчание их означает, что вы никогда не найдете их. Хотя, может быть, ты их не глотаешь... может быть, вы их регистрируете. Но почему вы пытаетесь / catch/log / продолжить, как будто ничего не произошло, позволяя программе работать в потенциально опасном и неожиданном состоянии? Просто позвольте ошибке пнуть вас в зубы, а затем исправить ее. Там немного больше разочарований, чем пытаться отладить что-то не так в программе, которую кто-то другой написал, потому что они завернул все в блок try / catch, а затем забыл войти.

другие просто говорят, что блоки try-catch должны использоваться везде, потому что они также могут быть расширены (расширение класса исключений).

есть потенциальная заслуга в этом, если вы тот, кто делает бросок, и вы пытаетесь предупредить себя об исключительной ситуации в вашей программе... но зачем пытаться / ловить свою собственную брошенную ошибку? Пусть он ударит вас по зубам, а затем исправить это так что вам больше не нужно бросать ошибку.

наконец кто-то говорит, что PHP try-catch block совершенно бесполезны, потому что они очень плохо реализованы. (На этом я нахожу хороший так вопрос о производительности).

может и так. Я не могу ответить на этот вопрос.

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

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

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

другой случай, когда что-то может пойти не так в нормальном функционировании дел. PHP не очень счастлив, поэтому это может произойти не очень много. В принципе, если вы столкнетесь с функцией, которая выдает исключение, когда она терпит неудачу, вы можете поймать исключение и сделать что-то еще в этом случае.

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

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

в приложении, которое мы в настоящее время разрабатываем на работе (используя Zend Framework, если это имеет значение), мы используем одну попытку..блок catch для перехвата всех исключений во всем приложении, которые отображаются пользователю, например, ошибка 500s и исключение регистрируется с дополнительной информацией в базе данных. Я, лично, люблю этот подход в случае применения PHP как исключения могут быть расширены, и вы можете в основном писать любую необходимую вам функциональность.

Я преимущественно использую Try / Catch вокруг вызовов базы данных...особенно входы, обновления и удаления и т. д.

Я иногда использую его вокруг сложной обработки данных с массивами и циклами, используя динамические данные и массивы, где есть шанс, что что-то может пойти не так, т. е.: отсутствующие элементы массива или что-то (я обычно проверяю такие вещи, хотя).

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

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

используйте хорошие методы программирования вместо того, как вы должны сделать повсюду. Не используйте try / catch как ленивый ярлык для всего, везде. Это большой перебор.

Я согласен с @scriptocalypse. На самом деле я использую только try/catch блоки в PHP в 2-х видах ситуаций.

  1. если возможно, что некоторые внешние (не внутри моего кода) проблемы или ошибки БД могут иметь место:

    • получение данных из другого источника (например. curl)
    • получение данных из файлов
    • DB-исключения
  2. Если я работаю внутри другой системы, например CMS или аналогичной, и я хочу переопределите определенное поведение. Например, я не хочу, чтобы исключение выбрасывалось, но сообщение об исключениях возвращалось в представление.

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

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

Если вы видите место, где вы думаете, что вам это нужно, я бы поставил один на.

EDIT: хорошо, вы можете поместить их везде, но вам нужно некоторое представление о том, где их поместить в свой код.

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

Comments

    Ничего не найдено.