Різниця між використанням Throwable та Exception у спробі лову


Відповіді:


247

До лову Throwableвін включає речі, які є підкласом Error. Як правило, цього не потрібно робити, за винятком, можливо, на самому високому рівні "ловити все", на якому ви хочете ввійти або іншим чином обробити абсолютно все, що може піти не так. Це було б більш типово для додатків типу фреймворку (наприклад, сервер додатків або тестова рамка), де він може працювати невідомим кодом, і на нього не може впливати нічого, що зіткнеться з цим кодом, наскільки це можливо.


30
Напевно, найкраще було б пояснити тут трохи ієрархії.
Xonatron

11
Контекст для цієї відповіді: Throwable включає як помилки, так і винятки як підкласи, тому перша спроба / улов включає в себе другий, але зазвичай загальний.
Ноель

2
Він також включає визначені користувачем прямі підкласи Throwable та самі екземпляри Throwable. Ніщо не заважає тобі писати throw new Throwable();, тому це єдиний спосіб по-справжньому зловити все.
Сурма

3
Незважаючи на те, що це прийнято, це не відповідає на питання, оскільки більшість відповідей описує найкращу практику лову як «Винятку», так і «Throwable», а питання стосується різниці (як у тому, коли використовувати який, коли я і хочу). "Включає речі, які помилка підкласу" є єдиною різницею, і це справді вичерпна відповідь: що таке помилка? Чому важливо, що вона включає його? Будь-які інші відмінності чи найкращі практики?
Нив

@OdedNiv "Що таке помилка? Чому важливо, що вона включає її?" Ви можете задати їх іншим питанням.
Кронен

182

Перший Throwableохоплює всі підкласи (включаючи Exceptionі Error), другий - всі підкласи Exception.

Errorпрограмно не підлягає відновленню жодним чином і зазвичай не підлягає виловленню, за винятком цілей ведення журналу (який передає його знову). Exceptionє програмно відновним. Її підклас RuntimeExceptionвказує на помилку програмування, і зазвичай його також не можна спіймати.


37
Досить дивно, що через 4 роки після цієї відповіді більшість інструментів "аналізу коду" все ще повідомлятимуть про вилучення, що підлягає перегляду, як критичну помилку. Ведення журналу є дуже вагомою причиною лову Throwable. Роки серверів, що розвиваються, говорять мені про те, що 1) Ведення Errorжурналів відбуватиметься, незважаючи на отримання журналу, і 2) Якщо не буде журналу, ви ніколи не отримуватимете повідомлення про те, що сталася OOM, і вас цікавить, чому сервер почав вести себе "смішно"
Бруно Грідер

4
Що programmatically unrecoverableсаме означає? Це настільки серйозно, що ми не можемо в основному викликати БУДЬ-ЯКІЙ метод Java після того, як вже піймаємо його (ведення журналів тощо), без шансів отримати непередбачувану поведінку від JVM в результаті?
Олександр Абакумов

Its subclass RuntimeException indicates a programming error: Не впевнений, чи згоден я з цим твердженням. Якщо це правда, це означає, що всі очікувані винятки повинні бути перевірені виключеннями. Що робити, якщо я очікую, що щось може вийти з ладу і не піддається відновленню моєю заявою, але я хочу хоча б принести важливий виняток? Використання перевіреного винятку в цьому випадку видається марним і створює код коробки.
Nom1fan

22

Thowableловить насправді все, навіть ThreadDeath, який за замовчуванням стає кинутим, щоб зупинити потік із застарілого Thread.stop()методу. Таким чином, ловлячись, Throwableви можете бути впевнені, що ви ніколи не залишите пробний блок, хоча б не пройдете ваш блок вилову, але ви повинні бути готові також обробляти OutOfMemoryErrorта InternalErrorабо StackOverflowError.

Ловля Throwableнайкорисніша для зовнішніх циклів сервера, які делегують всілякі запити на зовнішній код, але сама по собі ніколи не може припинятися, щоб підтримувати службу в живих.


21

Throwableце супер клас Exception, а також Error. У звичайних випадках нам завжди слід вловлювати підкласи Exception, щоб першопричина не загубилася.

Тільки спеціальні випадки , коли ви бачите можливість речей відбувається неправильно , яка не контролює код Java, ви повинні зловити Errorабо Throwable.

Я пам’ятаю, як ловив "Throwable", щоб рідна бібліотека не завантажена.


0

Я бачив, як люди використовують Throwable, щоб вловлювати деякі помилки, які можуть статися через поломку інфраструктури / недоступність.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.