В Java, что я видел до сих пор является то, что всякий раз, когда мы сгенерирует исключение, мы певд исключение. Как в следующем примере.
try{
somethingThatCanGoWrong();
}catch(Exception e){
throw new FailedToDoSomethingException("The other guy failed");
}
Всегда нужно бросить новый экземпляр исключения? Могу ли я сделать это следующим образом?
public class Blah
{
private static final FailedToDoSomethingException failedToDoSomethingException = new FailedToDoSomethingException(
"The other guy failed" );
public static void main( String[] args )
{
try {
somethingThatCanGoWrong();
} catch ( Exception e ) {
throw failedToDoSomethingException;
}
}
}
Я не предпочитаю последний пример из-за 2 причины.
- Объект-восточному говоря, любое исключение не является ни собственностью класса, ни свойство экземпляра.
Сбой треска многопоточной среды, когда сообщение Исключения динамически генерируются и основано на методу аргументе. Ниже приводится пример.
File getFile(String filePath){
throw new FileNotFoundException("File at path: "+filePath+" was not found");
}
Существуют ли какие - либо другие причины , кроме выше 2? Есть что - нибудь , что происходит за кулисами , когда мы создаем новый экземпляр исключения? что - то вроде заполнения контекста исключения (как StackTrace. Но я считаю , что происходит , когда мы используем throw
ключевое слово)?
Или это просто хорошая практика, чтобы бросить новый Exception все время? (Опять же, почему это хорошая практика?)
В StackTrace показывает линию, когда была создана Exception, так что вы не можете действительно увидеть, где он был брошен.
Вы можете выполнить этот пример:
public class Foo {
private static final RuntimeException re = new RuntimeException("MSG");
public static void main(String[] args) {
try {
Integer.parseInt("!!#!");
} catch (Exception e) {
throw re;
}
}
}
Когда вы посмотрите на StackTrace:
Exception in thread "main" java.lang.RuntimeException: MSG
at test.Foo.<clinit>(Foo.java:5)
Вы видите, что линия в StackTrace не линия, где вы на самом деле бросить исключение, а линия была вы звоните new