Накладные расходы, связанные с Exception vs Throwable в Java
Я знаю
throw new Exception();
имеет довольно большие накладные расходы, так как он создает полный стекTrace и т.д.
Есть ли
throw new Throwable();
представляет ту же проблему? Наследуется ли это поведение или бросает ли Throwable меньшие (o нет) накладные расходы?
ИЗМЕНИТЬ
С точки зрения аналитик пользователь, вставляющий неправильный пароль, является исключением из обычного порядка выполнения программы. Поэтому, если у меня есть:
public Session newSession() {
validate_user_and_password();
}
выброс исключения UserNotValidException будет корректным с точки зрения аналитиков.
Возврат null
или 0
просто звучит некорректно, если ваш код имеет довольно хорошую абстракцию. Я просто хотел знать, могу ли я реализовать это в коде, или если мне придется просто оставить его в теории.
Там есть хорошая разница между исключением из точки программирования и точки зрения и исключение аналитической точки зрения.
Примечание. Я дал очень простой и глупый пример, это не совсем мое дело.
Примечание 2: Я знаю, что возвращение null
было бы обычным делом, но я должен иметь правильно абстрагированный и OO-код, и, лично, я не вижу в этом никакого вреда.
Ответы
Ответ 1
Throwable
также создает стек, когда он создается. Из java docs для Throwable
:
throwable содержит моментальный снимок стека выполнения его потока во время его создания.
Итак, с точки зрения накладных расходов в отношении создания stacktrace не должно быть разницы между Exception
и Throwable
.
Если вы используете исключения для "исключительных событий" (как и должно быть), вы не должны слишком беспокоиться о накладных расходах stacktrace. Исключительное событие встречается редко при запуске кода. Таким образом, Исключения не должны влиять на производительность обычного кода каким-либо существенным образом.
Ответ 2
Нет, вам нужен ваш собственный подкласс, чтобы избежать этого эффекта.
Exception ex = new Exception() {
@Override public Throwable fillInStackTrace() {
return this; // and do nothing else
}
};
Это создает экземпляр исключения, который не будет заполнять трассировку стека (создание делегатов исключений для fillInStackTrace
для фактического заполнения трассировки стека) и, следовательно, дешево создавать.
Ответ 3
С JIT-компиляцией на самом деле не так уж и много, что есть много подслушивающих способов бросать Exception
в Java. Но выброс Throwable
не сильно отличается, так как вы также получите трассировку стека.
Если вам интересно, есть очень интересная статья под названием "Эффективная обработка исключений Java в компиляции вовремя" (ссылка). Не светлый, но довольно информативный.
Ответ 4
Вы никогда не должны бросать или ловить Throwable.
Область исключения слишком велика.
Как указывалось ранее, исключения должны использоваться только там, где это необходимо, т.е. в исключительных обстоятельствах и должны быть конкретными для ситуации, породившей их. Что в стороне, ловкость Throwable
подразумевает множество исключений, например OutOfMemoryException
. Ошибка такого значения не может быть восстановлена (легко) и не должна обрабатываться разработчиком.
Ответ 5
Throwable
является родительским классом Exception. поэтому Exception class
наследуется от Throwable
.
Ответ 6
Вы можете посмотреть исходный код двух классов, чтобы увидеть, что Exception
не делает ничего, кроме того, что выставляют одни и те же конструкторы как Throwable
. Все мясо и, следовательно, накладные расходы, живут в Throwable
.
Даже если Exception
действительно вводит некоторые дополнительные накладные расходы, вместо явной чрезмерной оптимизации следует использовать Throwable
. Используйте правильный инструмент для задания, не кооптировать неправильный инструмент только потому, что он легче.
Ответ 7
java.lang.Exception
extends java.lang.Throwable
, так что те же накладные расходы. Из Javadoc:
Класс Throwable является суперклассом всех ошибок и исключений на языке Java. Только объекты, являющиеся экземплярами этого класса (или одного из его подклассов), выдаются виртуальной машиной Java или могут быть выбраны оператором Java throw. Аналогично, только этот класс или один из его подклассов может быть типом аргумента в предложении catch.
Экземпляры двух подклассов "Ошибка и исключение" обычно используются для обозначения исключительных ситуаций. Как правило, эти экземпляры только что создаются в контексте исключительной ситуации, чтобы включить соответствующую информацию (например, данные трассировки стека).
Ответ 8
Java Exception
Как @mangoDrunk сказал: "Throwable - суперкласс исключения и ошибки".