Почему лучше не ловить исключения в классах общего назначения? - PullRequest
3 голосов
/ 12 марта 2011

Когда вы реализуете класс для какого-то общего назначения, почему бы не перехватывать исключения?

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

Ответы [ 4 ]

10 голосов
/ 12 марта 2011

Это правило лучше читать следующим образом: не обрабатывать исключения, которые вы не знаете, как обрабатывать!

Если, например, вы напишите класс, который читает файл CSV и возвращает токены строки, у вас будет несколькоточки в вашем классе, где может быть выброшено IOException.Вы определенно не должны ловить это, потому что это не ваша ответственность, чтобы справиться с этим!Ваша задача - преобразовать поток байтов в поток токенов, не более того.Если кто-то передает вам поврежденный поток, это должен обрабатывать он, а не вы.

EDIT : Другой пример: если ваша библиотека, например, достигает SocketException, и сокет былпередается в библиотеку от вызывающей стороны, затем передается исключение SocketException.Если ваша библиотека - это просто абстрактная структура соединений, которая также может подключаться к файлам, памяти и т. Д., А исключения SocketException не являются общими, заключите их в исключение ConnectionException.

2 голосов
/ 12 марта 2011

Он более объектно-ориентирован и скрывает детали реализации.

Как сказал Джошуа Блох в Effective Java:

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

1 голос
/ 12 марта 2011

«Брось рано лови поздно!»

Исключения следует отлавливать только там, где они имеют смысл и могут рассматриваться. Идея состоит в том, чтобы распространить исключение до уровня приложения до точки, где пользователь или бизнес-логика МОГУТ предпринять какое-либо действие в отношении исключения.

1 голос
/ 12 марта 2011

Можно ловить исключения, если после них у вас есть что-то полезное.Например, предположим, что вы получаете IOException после попытки сделать вызов веб-службы.При определенных обстоятельствах может иметь смысл перехватить это исключение и повторить вызов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...