Чи є у Java якийсь спосіб отримати (зловити) все exceptions
замість того, щоб спіймати виняток окремо?
Чи є у Java якийсь спосіб отримати (зловити) все exceptions
замість того, щоб спіймати виняток окремо?
Відповіді:
Якщо ви хочете, ви можете додати пункти закидання до своїх методів. Тоді вам не доведеться відразу ловити перевірені методи. Таким чином, ви можете зловити 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
блок перед загальним винятком.
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;
}
}
Однак це не враховує той факт, що IO також може викидати помилки. Помилки не є винятком. Помилки є меншою ієрархією успадкування, ніж Винятки, хоча обидва поділяють базовий клас Throwable. Оскільки IO може кидати помилки, ви можете зайти так далеко, щоб зловити 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;
}
}
Ловіть базовий виняток "Виняток"
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)
}
Ви можете зафіксувати кілька винятків в одному блоці лову.
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...
}