Когда Throwable должен использоваться вместо нового Исключения?

Как видно из документации , вы можете использовать add_filter для добавления эскапера,

add_filter( 'timber/twig', function( \Twig_Environment $twig ) {
    $twig->getExtension('Twig_Extension_Core')->setEscaper('csv', 'csv_escaper');
    return $twig;
} );

41
задан Neuron 29 April 2018 в 08:21
поделиться

11 ответов

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

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

14
ответ дан Zach Scrivena 27 November 2019 в 00:42
поделиться

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

38
ответ дан Neuron 27 November 2019 в 00:42
поделиться

Вы не должны действительно ловить исключение и бросать новое, столь же общее как "новое Исключение".

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

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
}

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

8
ответ дан MichaelD 27 November 2019 в 00:42
поделиться

<забастовка> Throwable является интерфейсом, не классом. Два класса расширяют Throwable, Исключение и Ошибку.

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

не фиксируют Ошибки - ошибки являются ошибками. Исправьте код вместо этого.

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

1
ответ дан Michiel de Mare 27 November 2019 в 00:42
поделиться

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

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

1
ответ дан Michael Borgwardt 27 November 2019 в 00:42
поделиться

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

Поэтому просто Исключение выгоды (или еще лучше, более мелкомодульное исключение).

0
ответ дан Bill K 27 November 2019 в 00:42
поделиться

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

0
ответ дан mP. 27 November 2019 в 00:42
поделиться

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

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

0
ответ дан mP. 27 November 2019 в 00:42
поделиться

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

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

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

0
ответ дан 27 November 2019 в 00:42
поделиться

Oracle дает ответ в его официальное учебное руководство ("Как Выдать исключения") .

Первый это объясняет, что Throwables объединение [1 118] Error и Exception классы, которые являются 2 разных вещи .

Throwable = Error + Exception

Затем, это ясно дает понять, что Error что-то чрезвычайно редкое, которое является почти [1 122] невозможными восстановиться от [1 122].

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

И соединение 1+1, это вежливо завершает , это (за исключением простого Exception с, там никакой смысл в ловле другой Throwable s, так как Вы ничего не можете сделать о них.

Простые программы обычно не ловят или бросают Ошибки.

0
ответ дан 27 November 2019 в 00:42
поделиться

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

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

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

0
ответ дан 27 November 2019 в 00:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: