Когда следует использовать Throwable вместо new Exception?

StackOverflow https://stackoverflow.com/questions/498217

  •  20-08-2019
  •  | 
  •  

Вопрос

Данный: Throwable является Exceptionэто суперкласс.

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

Мой вопрос заключается в следующем, когда следует Throwable быть использованным и когда следует new Exception() быть использованным?

Внутри catch или else блокируйте использование любого:

throw throwable;

или

throw new Exception();
Это было полезно?

Решение

(из комментариев) Проблема, из-за которой это возникло, заключается в том, что Мне нужно передать 'exception' в фрагмент кода, который создает коллега если коллекция не создается.

В этом случае, возможно, вы захотите создать проверенное исключение.Вы могли бы бросить Exception, соответствующий существующий его подкласс (за исключением RuntimeException и его подклассы , которые являются непроверенный), или пользовательский подкласс Exception (например,"CollectionBuildException").Смотрите на Учебник Java по исключениям чтобы быстрее разобраться с Java-исключениями.

Другие советы

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

На самом деле вам не следует перехватывать исключение и выдавать новое, такое общее, как "новое исключение".

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

try {
    // Do some stuff here
}
catch (DivideByZeroException e) {
    System.out.println("Can't divide by Zero!"); 
} 
catch (IndexOutOfRangeException e) { 
    // catch the exception 
    System.out.println("No matching element found.");
}
catch (Throwable e) {
    throw e; // rethrow the exception/error that occurred
}

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

Только в двух местах вы должны увидеть это слово 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 - это интерфейс, а не класс. Два класса расширяют Throwable, Exception и Error.

Правило таково:будьте как можно более конкретны при перехвате исключений - это означает, например, перехват Exception вместо Throwable и IOException вместо Exception .

Не улавливайте ошибки - ошибки есть ошибки.Вместо этого исправьте код.

Если вам нужно поймать абсолютно все, используйте "catch Throwable", но это дурной тон.

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

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

Как я слышал, когда впервые появилась Java, теория заключалась в том, что Throwable может использоваться для передачи управления в других случаях, помимо исключений.Однако я никогда не видел, чтобы его использовали таким образом (и это, вероятно, очень хорошо).

Так что просто отловите исключение (или, еще лучше, более мелкозернистое исключение).

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

Все исключения, в конце концов, являются проблемой...то, что ошибки - это баги, ничего не значит.

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

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

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

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

Вы также не должны использовать Исключения в качестве "возвращаемого типа"...

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

Я видел случаи, когда жесткие циклы, которые выдавали исключения как "отрицательные", напримерВыделение идентификатора, эта процедура занимала около 99% процессорного времени ..при замене на документированную возвращаемую константу этот показатель снизился до 25%.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top