Подтвердить что ты не робот

Попробуйте блокировать Catch внутри или вне функций и обработки ошибок

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

  • Основной guarnantee
  • Сильная гарантия
  • Гарантия NoThrow

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

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

Почему? ASSERT не компилируется в код выпуска, поэтому я не обременяю своих пользователей ошибкой при проверке своих собственных сбоев. Это те модульные тесты и ASSERTS. Булевы, потому что бросание исключения может дать неправильное сообщение. Исключения тоже могут быть дорогими. Если я исключаю исключения в ходе обычной реализации приложения, то я не могу использовать отладчик MS Visual Studio отличную функцию исключения "Поймать брошенную", где я могу отладчик разорвать программу в точке, в которой выбрано любое исключение, вместо того, чтобы по умолчанию останавливаться только при необработанных (сбоях) исключениях.

Чтобы увидеть технику С++ для основной гарантии, google "RAII" ( "Инициализация ресурсов" ). Это метод, при котором вы переносите ресурс в объект, чей конструктор выделяет ресурс, а whit destructor освобождает ресурс. Поскольку исключения С++ разворачивают стек, он гарантирует освобождение ресурсов перед исключениями. Вы можете использовать эту технику для отката состояния программы перед лицом исключения. Просто добавьте метод "Commit" к объекту, и если объект не был зафиксирован до его уничтожения, запустите операцию "Откат", которая восстанавливает состояние программы в деструкторе.

Ответ 3

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

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

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

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

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

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

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