Ну, в принципе, throw e
будет "перебрасывать" все исходные значения - также некоторый поток кода, который должен быть скрыт, например, например, из соображений безопасности.Если вы воссоздадите исключение, вы получите - или можете получить - еще одну трассировку стека на месте.
Итак, я бы сказал, у вас есть возможность замаскировать некоторые данные (не знаю, например, вы можете записывать исключения в специальный журнал, но вы захотите передать другие диагностические данные конечному пользователю).
Давайте немного проверим следующее:
- Я создал один класс как простой генератор исключений
- другой класс позволяет перебрасывать или воссоздавать исключение
- , потом я просто печатаю трассировку стека и сравниваю результаты
Генератор исключений
public class ExceptionsThrow {
public static void throwNewException() throws Exception {
throw new Exception("originally thrown message");
}
}
Класс для перебрасывания / воссоздания исключений
public class Exceptions {
public static void reThrowException() throws Exception {
try {
ExceptionsThrow.throwNewException();
} catch (Exception e) {
throw e;
}
}
public static void reCreateNewException() throws Exception {
try {
ExceptionsThrow.throwNewException();
} catch (Exception e) {
throw new Exception(e);
}
}
}
Пример кода тестирования:
try {
Exceptions.reThrowException();
} catch (Exception e) {
System.out.println("1st RETHROW");
e.printStackTrace();
System.out.println("===========");
}
try {
Exceptions.reCreateNewException();
} catch (Exception e) {
System.out.println("2nd RECREATE");
e.printStackTrace();
System.out.println("===========");
}
И наконец вывод:
1st RETHROW
java.lang.Exception: originally thrown message
at test.main.stackoverflow.ExceptionsThrow.throwNewException(ExceptionsThrow.java:5)
at test.main.stackoverflow.Exceptions.reThrowException(Exceptions.java:7)
at test.main.MainTest.main(MainTest.java:110)
java.lang.Exception: java.lang.Exception: originally thrown message===========
2nd RECREATE
at test.main.stackoverflow.Exceptions.reCreateNewException(Exceptions.java:17)
at test.main.MainTest.main(MainTest.java:118)
Caused by: java.lang.Exception: originally thrown message
at test.main.stackoverflow.ExceptionsThrow.throwNewException(ExceptionsThrow.java:5)
at test.main.stackoverflow.Exceptions.reCreateNewException(Exceptions.java:15)
... 1 more
===========
В этом случае вы можете видеть в основном те же данные, но некоторые дополнительные, вы можете увидеть исходное сообщение, потому что я использовал то же исключение для создания нового, но вам не нужносделай так, чтобы ты могНе указывайте исходную причину, или вам не нужно раскрывать логику приложения, например, давайте проверим еще один пример:
- Я возьму только причину из исходного исключения, но она переопределитданные
- , как вы можете видеть, вновь созданное исключение не содержит полную трассировку стека, как источник
Итак:
public static void maskException() throws Exception {
try {
ExceptionsThrow.throwNewException();
} catch (Exception e) {
throw new Exception("I will dont tell you",e.getCause());
}
}
Ирезультат:
===========
3rd mask
java.lang.Exception: I will don't tell you
at test.main.stackoverflow.Exceptions.maskException(Exceptions.java:25)
at test.main.MainTest.main(MainTest.java:126)
===========
Итак, я бы сказал, воссоздавать исключение с тем же экземпляром немного бессмысленно, но могут быть случаи, когда вы хотите сделать это так - маскировать данные илидругой случай также может быть, если вы хотите изменить тип исключения - например, с исключения ввода-вывода на общее исключение и т. д.
В реальном мире я часто вспоминаюпроблема, когда некоторые веб-порталы обрабатывали исключения в сценариях PHP только в этом случае печати, а затем обычно, когда соединение с базой данных работало некорректно, строки подключения (включая адрес базы данных инапример, учетные данные в виде открытого текста) были видны в веб-браузере.:)