Является ли в Java использование throws Exception вместо бросания нескольких конкретных исключений хорошей практикой? - PullRequest
13 голосов
/ 12 июня 2009

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

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

Ответы [ 15 ]

1 голос
/ 12 июня 2009

Брайан Гетц затрагивает некоторые из этих вопросов здесь . Также см. Effective Java 2nd Edition Джоша Блоха. Он посвящает целый раздел об исключениях. Кроме того, Род Джонсон, основатель Spring Framework, подробно описывает свои мысли об обработке исключений Java в J2EE Design and Development . Вы можете согласиться или не согласиться с его исключительной философией, но, по крайней мере, может иметь больше смысла, почему они приняли решения, которые они приняли.

alt text
(источник: sun.com )
alt text

1 голос
/ 12 июня 2009

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

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

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

0 голосов
/ 13 июня 2009

Tricky.

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

При написании фреймворка или библиотеки, хотя невозможно сказать -

абстрактный T func (...) бросает A, B, C;

потому что любой класс, который расширяет контейнер func (...), может потенциально переопределить func.

Я сам должен был использовать более слабую спецификацию «throws Exception», но, как правило,

  • Предоставить строгие спецификации исключений для частных методов (в контексте этого обсуждения я считаю методы частными в том смысле, что их контракт неизменен), свободная спецификация для всех остальных.
0 голосов
/ 12 июня 2009

Выдающее исключение также может вызвать множество проблем с управлением транзакциями в J2EE. Использование исключения catch - чистое зло!

Я не присуждаю тебе никаких котят!

0 голосов
/ 12 июня 2009

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

Одна возможная ошибка и решение включают:

при разборе int - NumberFormatException. Мы могли бы иметь значение по умолчанию

Итог, я думаю, что лучше сохранять отдельные исключения.

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