[java] Когда следует использовать Throwable вместо нового исключения?



Answers

Всегда бросайте Exception (никогда не Throwable ). Вы вообще не поймаете Throwable , но можете. Throwable - это суперкласс для Exception и Error , поэтому вы можете поймать Throwable если хотите не только перехватывать Exception s, но и Error s, это то, что нужно. Дело в том, что Error - это, как правило, то, что нормальное приложение не будет и не должно улавливать, поэтому просто используйте Exception если у вас нет конкретной причины использовать Throwable .

Question

Учитывая: Throwable - суперкласс Throwable Exception .

Когда я читаю тексты о написании собственных «исключений», я вижу примеры использования Throwable в блоке catch а в других текстах показано, что в блоке catch используется new Exception() . Я еще не видел объяснений, когда нужно использовать каждый.

Мой вопрос в том, когда следует использовать Throwable и когда следует использовать new Exception() ?

Внутри блока catch или else используется:

throw throwable;

или

throw new Exception();



throw new Exception(); это то, что вы никогда не должны делать в блоке catch, но вам может понадобиться или вы хотите сделать new SomeException(throwable); (сохраняя полную трассировку стека) вместо throw throwable; чтобы соответствовать API вашего метода, например, когда он объявляет о SomeException но вы вызываете код, который может генерировать IOException которое вы не хотите добавлять в предложение throws метода.

Вероятно, наиболее распространенным случаем является new RuntimeException(throwable); чтобы вообще не иметь throws . Многие люди скажут вам, что это ужасное злоупотребление, потому что вы должны использовать проверенные исключения. IMO они ошибаются и проверенные исключения являются ошибкой в ​​дизайне языка Java, что приводит к уродливому, не поддающемуся контролю коду.




Throwable предназначен только для захвата контейнера или основного цикла вашей программы. Большая часть времени, когда вы ловите материал ниже Exception, например, Error не добавляет много возможностей для программы, ведь все, что вы можете сделать, если вызывают ошибки VirtualError. Не так много, кроме журнала и продолжайте.




Только в двух местах вы должны увидеть слово Throwable в коде:

public static void main(String args[])
{
     try
     {
         // Do some stuff
     }
     catch(Throwable t)
     {

     }
 }

А ТАКЖЕ

public class SomeServlet extends HttpServlet
{
      public void doPost(HttpRequest request, HttpResponse response)
      {
         try
         {
             // Do some stuff
         }
         catch (Throwable t)
         {
              // Log
         }
      }
 }



Как правило, вы не бросаете или не бросаете Throwable. В частности, ошибки JVM (которые расширяют Error ()) не предназначены для захвата кода пользователя, если вы не выполняете странную работу на системном уровне.

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

Это включает в себя как регулярные ситуации с ошибками (по «регулярному», я имею в виду, в отличие от ошибок JVM), и места, где вы используете исключения в качестве механизма управления.




Links