Пользовательский класс исключений - распространяется от Exception или Thowable?

Я разрабатываю пользовательский класс исключения для своего приложения. У меня есть очень простой вопрос. Должен ли я расширяться из класса Exception или Thowable class? Каковы преимущества?

Я намерен выкинуть это из нижних слоев и поймать его в классах верхнего уровня. Будет ли это влиять на мое решение об использовании Thowable over Exception. В принципе ли это право поймать Thowable?

В этом форуме я прошел через другие темы. Они говорят о том, что отслеживание стека сохраняется, когда оно выбрасывается, и не имеет его для исключения и т.д. Я понимаю, что некоторые говорят (здесь), что Thowable - это суперкласс Exception, и мы не должны его использовать. Но другие (здесь) говорят, что исключение - для "исключительных" случаев.

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

Ответ 1

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

Error - это что-то, вы не можете обрабатывать вообще: OutOfMemoryError, VirtualMachineError и т.д.

Exception для исключительных случаев.

Исключения имеют 2 варианта:

  • RuntimeException с.

    Этих, вы не знаете: NullPointerException, ClassCastException и т.д.

  • Checked исключения.

    Это исключения, которые ваш код знает и должен быть явно пойман (... throws MyException): IOException s и т.д.

Если вы хотите, чтобы пользователи вашего кода явно обращались с некоторыми исключительными ситуациями, было бы неплохо расширить Exception, а не RuntimeException. Нет необходимости расширять Throwable.

Ответ 2

В основном вы должны расширять класс Exception при создании Custom Exception. Exception и Error оба расширяются Throwable, на самом деле не имеет смысла расширение Throwable.

Ответ 3

Throwable - суперкласс Error и Exception.

Подобно Exception, Error тоже можно бросить и обработать.

Но не рекомендуется, согласно следующему документу:

Вам не требуется ловить объекты Error или подтипы Error. Ты можешь также бросайте ошибку самостоятельно (хотя кроме AssertionError вы вероятно, никогда не захочет), и вы можете поймать одного, но опять же, вы вероятно, не будет. Что, например, вы бы сделали, если бы получили OutOfMemoryError?

Помня эту концепцию, я предлагаю расширить Throwable, если вы хотите бросить и/или поймать Exception и Error оба. Расширьте Exception, если вы хотите только бросить и/или поймать Exception.