Я застрял, решая, как обрабатывать исключения в моем приложении.
Во многом мои проблемы с исключениями возникают из-за 1) доступа к данным через удаленную службу или 2) десериализации объекта JSON. К сожалению, я не могу гарантировать успех ни в одной из этих задач (отключение сетевого подключения, искаженный объект JSON, который находится вне моего контроля).
В результате, если я обнаруживаю исключение, я просто перехватываю его внутри функции и возвращаю FALSE вызывающей стороне. Моя логика такова, что все, что действительно волнует вызывающего, - это то, была ли задача успешна, а не почему она не была успешной.
Вот пример кода (на JAVA) типичного метода)
public boolean doSomething(Object p_somthingToDoOn)
{
boolean result = false;
try{
// if dirty object then clean
doactualStuffOnObject(p_jsonObject);
//assume success (no exception thrown)
result = true;
}
catch(Exception Ex)
{
//don't care about exceptions
Ex.printStackTrace();
}
return result;
}
Я думаю, что этот подход хорош, но мне действительно любопытно узнать, каковы лучшие практики для управления исключениями (действительно ли я должен пузырить исключение на всем пути вверх по стеку вызовов?).
Вкратце по ключевым вопросам:
- Можно ли просто перехватывать исключения, но не всплывать или формально уведомлять систему (через журнал или уведомление для пользователя)?
- Какие существуют передовые практики для исключений, которые не приводят ко всему, что требует блока try / catch?
Продолжить / Редактировать
Спасибо за все отзывы, нашел несколько отличных источников по управлению исключениями в Интернете:
- Лучшие практики обработки исключений | O'Reilly Media
- Рекомендации по обработке исключений в .NET
- Лучшие практики: управление исключениями (статья теперь указывает на копию archive.org)
- Антипаттерны обработки исключений
Кажется, что управление исключениями - одна из тех вещей, которые различаются в зависимости от контекста. Но самое главное, нужно быть последовательным в том, как они управляют исключениями в системе.
Кроме того, следите за гниением кода из-за чрезмерного количества попыток / уловок или отказа от исключения (исключение - предупреждение системы, о чем еще нужно предупредить?).
Кроме того, это прекрасный комментарий от m3rLinEz .
Я склонен согласиться с Андерсом Хейлсбергом и вами в том, что большинство звонящих заботятся только о том, прошла ли операция успешно или нет.
Из этого комментария возникает ряд вопросов, о которых следует подумать при работе с исключениями:
- Какой смысл генерировать это исключение?
- Как имеет смысл с этим справляться?
- Действительно ли вызывающий абонент заботится об исключении или его просто волнует, был ли вызов успешным?
- Является ли изящным принуждение вызывающего абонента к управлению потенциальным исключением?
- Вы уважаете языковые идомы?
- Вам действительно нужно возвращать флаг успеха, например логическое? Возврат логического значения (или int) - это скорее мышление C, чем Java (в Java вы просто обрабатываете исключение).
- Следуйте конструкциям управления ошибками, связанным с языком :)!