#java #исключения
Какие исключения относятся к необработанным? Те, которые не были обёрнуты в try-catch? Исключение, которое создаётся в методе, объявленном с throws Exception, относится к обработанным? Т.е. это уже "handled exception"? И следующее исключение будет "handled" или "unhandled"? public static void main(String[] args) throws Exception { throw new Exception("ololo"); }
Ответы
Ответ 1
Исключения обрабатываются в соответствующем (внешнем, подходящем по типу) блоке catch. Соответственно, обработанное исключение — то, которое отлавливается одним из блоков catch, а необработанное — то, которое не отлавливается. В спецификации Java конкретное определение «необработанное исключение» я не нашел. Вместо этого определяются перехваченные исключения и точно описано, что произойдет с неперехваченными исключениями: Chapter 11. Exceptions. ... During the process of throwing an exception, the Java Virtual Machine abruptly completes, one by one, any expressions, statements, method and constructor invocations, initializers, and field initialization expressions that have begun but not completed execution in the current thread. This process continues until a handler is found that indicates that it handles that particular exception by naming the class of the exception or a superclass of the class of the exception (§11.2). If no such handler is found, then the exception may be handled by one of a hierarchy of uncaught exception handlers (§11.3) - thus every effort is made to avoid letting an exception go unhandled. ... 11.3. Run-Time Handling of an Exception ... If no catch clause that can handle an exception can be found, then the current thread (the thread that encountered the exception) is terminated. Before termination, all finally clauses are executed and the uncaught exception is handled according to the following rules: - If the current thread has an uncaught exception handler set, then that handler is executed. - Otherwise, the method uncaughtException is invoked for the ThreadGroup that is the parent of the current thread. If the ThreadGroup and its parent ThreadGroups do not override uncaughtException, then the default handler's uncaughtException method is invoked. Глава 11. Исключения. ... В процессе генерации исключения JVM немедленно поочередно завершает все выражения, инструкции, вызовы методов и конструкторов, инициализаторы и выражения инициализации полей, которые были начаты, но не завершены в текущем потоке. Этот процесс продолжается до тех пор, пока не будет обнаружен обработчик, который указывает, что он обрабатывает это конкретное исключение, путем именования класса исключения или его суперкласса. Если такой обработчик не найден, то исключение может быть обработано одним из элементов иерархии обработчиков неперехваченных сообщений ($11.3). Таким образом, делается все возможное, чтобы не допустить возможности существования неперехваченного исключения. ... $11.3. Обработка исключений времени выполнения. ... Если конструкция catch, способная обработать сгенерированное исключение, не найдена, то текущий поток выполнения (поток, в котором сгенерировано исключение) завершается. Перед завершением выполняются все конструкции finally, а неперехваченное исключение обрабатывается в соответствии со следующими правилами. - Если текущий поток имеет установленный обработчик неперехваченных исключений, вызывается этот обработчик. - В противном случае для группы ThreadGroup, которая представляет собой родителя текущего потока, вызывается метод uncaughtException. Если ThreadGroup и ее родительские ThreadGroup не перекрывают uncaughtException, то вызывается метод uncaughtException обработчика по умолчанию. На практике фраза «unhandled exception» обычно употребляется в более узком контексте и относится не к JVM, а к какому-либо процессу/классу/методу. В этом случае имеется ввиду неожиданное исключение, которое выбрасывается в вызывающий код. Например: «исключения, не обработанные при разборе файла, должны быть отражены в журнале ошибок». Конструкция throws в объявлении метода не связана напрямую с перехватом/обработкой исключений. Если нужно как-то назвать перечисленные типы исключений, то скорее подойдет «объявленные типы исключений» («declared exception types»).
Комментариев нет:
Отправить комментарий