2016-05-04 7 views
7

Недавно я заметил, что Exception имеет несколько конструкторов, которые принимают в качестве параметра Throwable. Throwable имеет два подкласса: Error и Exception, и, как правило, вся документация указывает, что вы не должны пытаться поймать или обработать Error. Поэтому мне любопытно, почему Exception принимает значение Throwable как параметр конструктора вместо Exception. Это означает, что Exception может быть создан с Error в качестве причины и может быть обработан приложением. Почему это так?Почему исключение принимает Throwable как параметр конструктора вместо Exception?

Должны ли пользовательские классы Exception предоставлять только конструкторы, которые принимают Exception в качестве параметров?

+0

Просто угадывание: может быть, иногда люди все еще пытаются каким-то образом исключить извещение; и, возможно, это проще, если вы используете некоторые из своих собственных исключений специального типа; и поэтому вы допускаете, чтобы такие вещи были обернуты вокруг Throwable. Или, может быть, языковые папы и мамы просто не думали об этом. – GhostCat

+0

JAVADoc syas: * «Ошибка - это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать. Большинство таких ошибок являются ненормальными условиями». * Но это не мешает вам их поймать. – user2004685

ответ

3

Я предполагаю, что это в основном потому, что:

  1. это не рекомендуется обрабатывать Error но это не запрещено.

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

2

ИМХО, Exception Классы принимает Throwable в качестве параметра, потому что некоторые библиотеки или API, может создать свой собственный тип, который расширяет Throwable, а затем ваш Exception Handler должны быть в состоянии иметь дело с теми, как хорошо.

Также вы можете throw в Throwable не обязательно Exception, Это делает его очень легко бросить то, что является пользовательским типом сбоя программы, и на основании, что она будет иметь это уровень «возвратность».

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

Смежные вопросы