В Java есть ли способ получить (поймать) все, exceptions
а не поймать исключение по отдельности?
В Java есть ли способ получить (поймать) все, exceptions
а не поймать исключение по отдельности?
Ответы:
Если хотите, вы можете добавить в свои методы предложения throws. Тогда не обязательно сразу ловить проверенные методы. Таким образом, вы сможете поймать более exceptions
позднее время (возможно, одновременно с другим exceptions
).
Код выглядит так:
public void someMethode() throws SomeCheckedException {
// code
}
Позже вы сможете справиться с ними, exceptions
если не хотите иметь дело с ними этим методом.
Чтобы перехватить все исключения, какой-то блок кода может выдать, вы можете сделать: (Это также поймает, что Exceptions
вы написали сами)
try {
// exceptional block of code ...
// ...
} catch (Exception e){
// Deal with e as you please.
//e may be any type of exception at all.
}
Причина, по которой это работает, заключается в том, что Exception
это базовый класс для всех исключений. Таким образом, любое исключение, которое может быть сгенерировано, обозначается Exception
буквой E в верхнем регистре.
Если вы хотите сначала обработать свои собственные исключения, просто добавьте catch
блок перед общим Exception.
try{
}catch(MyOwnException me){
}catch(Exception e){
}
Хотя я согласен с тем, что перехватывать необработанное исключение - не лучший стиль, существуют способы обработки исключений, которые обеспечивают превосходное ведение журнала и возможность обрабатывать неожиданные ситуации. Поскольку вы находитесь в исключительном состоянии, вы, вероятно, больше заинтересованы в получении хорошей информации, чем во времени ответа, поэтому производительность instanceof не должна иметь большого успеха.
try{
// IO code
} catch (Exception e){
if(e instanceof IOException){
// handle this exception type
} else if (e instanceof AnotherExceptionType){
//handle this one
} else {
// We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy.
throw e;
}
}
Однако при этом не учитывается тот факт, что ввод-вывод также может вызывать ошибки. Ошибки - не исключения. Ошибки относятся к другой иерархии наследования, чем исключения, хотя оба имеют общий базовый класс Throwable. Поскольку ввод-вывод может генерировать ошибки, вы можете пойти еще дальше и поймать Throwable
try{
// IO code
} catch (Throwable t){
if(t instanceof Exception){
if(t instanceof IOException){
// handle this exception type
} else if (t instanceof AnotherExceptionType){
//handle this one
} else {
// We didn't expect this Exception. What could it be? Let's log it, and let it bubble up the hierarchy.
}
} else if (t instanceof Error){
if(t instanceof IOError){
// handle this Error
} else if (t instanceof AnotherError){
//handle different Error
} else {
// We didn't expect this Error. What could it be? Let's log it, and let it bubble up the hierarchy.
}
} else {
// This should never be reached, unless you have subclassed Throwable for your own purposes.
throw t;
}
}
Поймать базовое исключение Exception
try {
//some code
} catch (Exception e) {
//catches exception and all subclasses
}
Поймать исключение - плохая практика - оно слишком широко, и вы можете пропустить что-то вроде исключения NullPointerException в собственном коде.
Для большинства файловых операций исключение IOException является корневым исключением. Лучше поймать это вместо этого.
Да, есть.
try
{
//Read/write file
}catch(Exception ex)
{
//catches all exceptions extended from Exception (which is everything)
}
Вы можете поймать несколько исключений в одном блоке catch.
try{
// somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
// handle exception.
}
Вы имеете в виду перехватить выброс Exception
любого типа , а не только определенные исключения?
Если так:
try {
//...file IO...
} catch(Exception e) {
//...do stuff with e, such as check its type or log it...
}