Пользовательский класс исключений - распространяется от 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
.