Попробуйте блоки Выгоды внутри или снаружи ошибочного вручения и функций

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

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

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

Треть является комбинацией с выгодой попытки вне функции и внутри. Однако, если выгода попытки функций ловит что-то, она выводит другое исключение для блока выгоды попытки вне функции для ловли.

Какие-либо мысли о профессионалах/недостатках этих методов для контроля ошибок или если существует принятый стандарт? Мои навыки ниндзя гугления привели меня к сбою при нахождении точных данных по этому.

26
задан John Saunders 22 January 2010 в 19:23
поделиться

6 ответов

В целом исключение должно быть поймано только в том случае, если оно на самом деле может быть обработано.

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

18
ответ дан 28 November 2019 в 17:16
поделиться

Единственный вопрос о увольнении исключения: «Есть ли несколько стратегий для получения чего-либо»? »

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

Все остальные исключения будут брошены.

Если нет никаких альтернативных стратегий, исключение будет просто брошено.

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

0
ответ дан 28 November 2019 в 17:16
поделиться

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

Даже если некоторые исключения обрабатываются на нижнем слое вашей системы, убедитесь, что у вас есть обработчик исключений на точку входа (например, при внедрении новой поток (т. Е. Runnable), сервлета, Messasgedrivebean, сервер розетка и т. Д.). Это часто лучшее место для принятия окончательного решения о том, как ваша система должна продолжаться (журнал и повторение, выход с ошибкой, отката транзакции)

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

Кроме того, это зависит от функции, которую вы реализуете. Вы находитесь в цикле, если остальные элементы будут повторены или весь список прерваны?

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

1
ответ дан 28 November 2019 в 17:16
поделиться

Каждый «модуль» в приложении несет ответственность за обработку собственных входных параметров. Обычно вы должны найти проблемы как можно скорее, а не рука мусор в другую часть приложения и полагаться на них, чтобы быть правильными. Есть исключения, хотя. Иногда подтверждение входного параметра в основном требуется переосмысление того, что должно делать Callee (например, разбирающееся целое число) в вызывающем абонете. В этом случае обычно целесообразно попробовать операцию и посмотреть, работает ли она или нет. Более того, есть некоторые операции, которые вы не можете предсказать их успех, не делая их. Например, вы не можете надежно проверять, можете ли вы написать в файл перед записью к нему: другой процесс может немедленно заблокировать файл после проверки.

2
ответ дан 28 November 2019 в 17:16
поделиться

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

0
ответ дан 28 November 2019 в 17:16
поделиться

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

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

  • Basic Guarnantee
  • Сильная гарантия
  • Nothrow Гарантия

Основная гарантия просто означает, что перед лицом исключения или другая ошибка, никакие ресурсы не просочиваются, прочная гарантия говорит, что государство программы Откатывается назад до исключения, а методы Nothrow не бросают исключения.

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

Почему? Assert не скомпилирован в код выпуска, поэтому я не загрузку моих пользователей с проверкой ошибок для моих собственных сбоев. Это какие единичные тесты и утверждения. Логические, потому что бросание исключения может дать неправильное сообщение. Исключения могут быть дорогими тоже. Если я бросаю исключения в обычный ход выполнения приложения, то я не могу использовать отличный «уловки отладчика MS Visual Studio Debugger», где я могу иметь отладчик разбить программу в том, что любой Исключение выброшено, а не по умолчанию только остановка в необработанных (сбоях) исключениях.

Чтобы увидеть технику C ++ для основной гарантии Google «Raii» (приобретение ресурсов инициация). Это техника, в которой вы обертываете ресурс в объекте, конструктор которого выделяет ресурс, а деструктор освобождает ресурс. Поскольку исключения C ++ раскручивают стек, он гарантирует, что ресурсы освобождаются перед лицом исключения. Вы можете использовать эту технику, чтобы отбросить состояние программы перед лицом исключения. Просто добавьте метод «Commun» для объекта, и если объект не предан преданству, прежде чем он будет уничтожен, запустите операцию «Откат», которая восстанавливает состояние программы в деструктор.

4
ответ дан 28 November 2019 в 17:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: