Остаточний блок завжди виконується після закінчення пробного блоку, будь то спроби закінчуються нормально або аномально через виняток, ер, кидальний.
Якщо виняток кидається будь-яким кодом у блоці спробу, то поточний метод просто повторно кидає (або продовжує викидати) той самий виняток (після запуску остаточно блоку).
Якщо, нарешті, блок кидає виняток / помилку / кидаючий, і вже є відкладений кидаючий, він стає некрасивим. Відверто кажучи, я точно забуваю, що трапляється (стільки за мою сертифікацію років тому). Я думаю обидві кидаючі деталі з’єднуються між собою, але є якийсь особливий вуду, який ти повинен зробити (тобто - виклик методу, який я повинен був би шукати), щоб отримати первісну проблему, перш ніж "нарешті" заграли, ер, кинули.
Між іншим, спроба / нарешті - досить поширена справа для управління ресурсами, оскільки у Java немає руйнівників.
Наприклад -
r = new LeakyThing();
try { useResource( r); }
finally { r.release(); } // close, destroy, etc
«Нарешті», ще одна порада: якщо ви дійсно потрудилися поставити в улові, або зловити конкретний (очікується) Throwable підкласів, або просто зловити «Throwable», НЕ «Виключення», для загального прийому всієї пастки помилок. Занадто багато проблем, таких як рефлексивні рефлекси, викидають "Помилки", а не "Винятки", і вони будуть ковзати під будь-яким кодом "зловити всіх":
catch ( Exception e) ... // doesn't really catch *all*, eh?
зробіть це замість цього:
catch ( Throwable t) ...