Іноді, бачу
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", щоб рідна бібліотека не завантажена.