Intereting Posts
как сделать эхо-печать прямо сейчас на PHP? Почему getenv () возвращает только переменную при запуске с терминала, а не через веб-сервер отладка веб-приложения Yii с использованием Zend Debugger в Eclipse Как устранить ошибку « file_get_contents (/var/www/laravel/.env): не удалось открыть поток: нет такого файла или каталога»? Magento Изменить названия страниц продуктов для включения атрибутов Laravel – цикл Foreach – показать конкретное сообщение о типах результата как объединить несколько запросов (выбранный статус) в моем случае? Проверьте, перекрывается ли два раза Представление ajax-формы с php Неустранимая ошибка в преобразовании PPT в PNG в PHP Можно ли использовать WordPress API для создания сообщений на wordpress.com? PHP is_writeable или открыт другой программой? Ошибка FPDF: некоторые данные уже выведены, не удается отправить файл PDF на 000webhost ROWS не возвращается в Youtube Analytics API? PHP проверяет, является ли переменная целым числом

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

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

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

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

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

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

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

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

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

Давайте рассмотрим приведенные вами примеры и посмотрим, как они совпадают с этим списком.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: ОК, вы можете их повесить, но вам нужно знать, куда их поместить в свой код.

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

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

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

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