Іноді, бачу
try {
} catch(Throwable e) {
}
А іноді
try {
} catch(Exception e) {
}
Яка різниця?
Іноді, бачу
try {
} catch(Throwable e) {
}
А іноді
try {
} catch(Exception e) {
}
Яка різниця?
Відповіді:
До лову Throwable
він включає речі, які є підкласом Error
. Як правило, цього не потрібно робити, за винятком, можливо, на самому високому рівні "ловити все", на якому ви хочете ввійти або іншим чином обробити абсолютно все, що може піти не так. Це було б більш типово для додатків типу фреймворку (наприклад, сервер додатків або тестова рамка), де він може працювати невідомим кодом, і на нього не може впливати нічого, що зіткнеться з цим кодом, наскільки це можливо.
throw new Throwable();
, тому це єдиний спосіб по-справжньому зловити все.
Перший Throwable
охоплює всі підкласи (включаючи Exception
і Error
), другий - всі підкласи Exception
.
Error
програмно не підлягає відновленню жодним чином і зазвичай не підлягає виловленню, за винятком цілей ведення журналу (який передає його знову). Exception
є програмно відновним. Її підклас RuntimeException
вказує на помилку програмування, і зазвичай його також не можна спіймати.
Error
журналів відбуватиметься, незважаючи на отримання журналу, і 2) Якщо не буде журналу, ви ніколи не отримуватимете повідомлення про те, що сталася OOM, і вас цікавить, чому сервер почав вести себе "смішно"
programmatically unrecoverable
саме означає? Це настільки серйозно, що ми не можемо в основному викликати БУДЬ-ЯКІЙ метод Java після того, як вже піймаємо його (ведення журналів тощо), без шансів отримати непередбачувану поведінку від JVM в результаті?
Its subclass RuntimeException indicates a programming error
: Не впевнений, чи згоден я з цим твердженням. Якщо це правда, це означає, що всі очікувані винятки повинні бути перевірені виключеннями. Що робити, якщо я очікую, що щось може вийти з ладу і не піддається відновленню моєю заявою, але я хочу хоча б принести важливий виняток? Використання перевіреного винятку в цьому випадку видається марним і створює код коробки.
Thowable
ловить насправді все, навіть ThreadDeath, який за замовчуванням стає кинутим, щоб зупинити потік із застарілого Thread.stop()
методу. Таким чином, ловлячись, Throwable
ви можете бути впевнені, що ви ніколи не залишите пробний блок, хоча б не пройдете ваш блок вилову, але ви повинні бути готові також обробляти OutOfMemoryError
та InternalError
або StackOverflowError
.
Ловля Throwable
найкорисніша для зовнішніх циклів сервера, які делегують всілякі запити на зовнішній код, але сама по собі ніколи не може припинятися, щоб підтримувати службу в живих.
Throwable
це супер клас Exception
, а також Error
. У звичайних випадках нам завжди слід вловлювати підкласи Exception
, щоб першопричина не загубилася.
Тільки спеціальні випадки , коли ви бачите можливість речей відбувається неправильно , яка не контролює код Java, ви повинні зловити Error
або Throwable
.
Я пам’ятаю, як ловив "Throwable", щоб рідна бібліотека не завантажена.