Какие обстоятельства должны кто-то "попробовать ... поймать"?Это относится к библиотекам? - PullRequest
3 голосов
/ 26 октября 2010

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

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

Как разработчик подходит к обработке исключений для всех общих аспектов разработки? Есть ли шаблон или шаблон для подражания?

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

Ответы [ 5 ]

4 голосов
/ 26 октября 2010

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

Для обработки я бы сказал, что есть два обстоятельства, когда вы хотите поймать исключение:

когда нужно выполнить перевод

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

на границе модуля

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

Если вы окажетесьделая попытку-поймать-очистить-перебросить вещи, используйте RAII и избавьтесь от попытки ... поймать полностью.Напишите свой код так, чтобы, если исключение произошло, оно действовало в здравом смысле.Посмотрите Гарантии Абрахама для подробностей о том, что это влечет за собой.


Ответ на MakerOfThings7 ниже, потому что это было слишком долго для комментария.

Автор: "Что-то, что пользователь может понять,«Я имею в виду, например, всплывающее сообщение об ошибке.

Представьте, если хотите, пользователь нажимает кнопку на пользовательском интерфейсе вашего приложения, чтобы перейти и получить некоторые данные.Ваш обработчик нажатия кнопки отправляет некоторый интерфейс хранения данных.Этот интерфейс может получать данные из потока памяти, из файла, из базы данных.Кто знает?В свою очередь, это может привести к сбою, генерируя исключение MemoryStreamException, FileException или DatabaseException.Они могли быть сброшены на 15 кадров стека и были правильно проигнорированы хорошо написанным безопасным для исключений кодом, который не нуждался в их переводе.

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

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

0 голосов
/ 26 октября 2010

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

0 голосов
/ 26 октября 2010

Вообще говоря:

  1. Брось исключение для исключительных условий.

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

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

0 голосов
/ 26 октября 2010

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

0 голосов
/ 26 октября 2010

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

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

Простомои два цента:).

...