Перейти к основному содержимому

Иерархия исключений в Groovy

Разработчику Архитектору

Иерархия исключений в Groovy

Интерактивное демо — часть сценариев на Python (try / except); в Groovy — как в Java (try / catch), но стек вызовов и раскрутка те же. Подробнее: ошибки и исключения.

Play ITЗагрузка интерактивного демо…

Теория

Groovy компилируется в байт-код JVM: исключения — те же классы java.lang.*, синтаксис try / catch / finally.

Компилятор Groovy не требует объявлять проверяемые исключения, в отличие от Java.

См. ошибки и исключения и иерархию в Java.


Корневой класс

  • java.lang.Throwable

Основные ветви (те же, что в Java)

  1. java.lang.Error — фатальные ошибки виртуальной машины (обычно не перехватываются).
  2. java.lang.Exception — базовый класс для всех исключений.

Однако в Groovy:

  • Нет проверяемых исключений: компилятор Groovy игнорирует механизм throws, принятый в Java.
  • Можно вызывать методы, которые в Java объявлены как выбрасывающие IOException, без блока try/catch и без объявления throws.

Специфичные исключения Groovy

Помимо стандартных исключений Java, Groovy определяет собственные типы исключений в пакете groovy.lang и других модулях стандартной библиотеки Groovy:


Из groovy.lang

  • groovy.lang.GroovyRuntimeException — базовый класс для большинства исключений времени выполнения Groovy.
    • groovy.lang.MissingMethodException — вызов несуществующего метода.
    • groovy.lang.MissingPropertyException — обращение к несуществующему свойству.
    • groovy.lang.ReadOnlyPropertyException — попытка записи в свойство только для чтения.
    • groovy.lang.ScriptException — ошибка при выполнении скрипта.
  • groovy.lang.GroovyCastException — неудачное приведение типов (например, (Integer)"abc").

Из groovy.json

  • groovy.json.JsonException
    • groovy.json.JsonSlurperException

Из groovy.xml

  • groovy.xml.XmlException
    • groovy.xml.MarkupBuilderException

Из groovy.sql

  • Ошибки SQL при работе через groovy.sql.Sql — это java.sql.SQLException (Groovy не вводит отдельный тип для SQL-ошибок).

Из groovy.transform и метапрограммирования

  • groovy.lang.GroovyInterceptableException — при ошибках в перехвате вызовов.
  • groovy.lang.GroovySystemOperationException — при ошибках системного уровня (редко).

Другие

  • groovy.util.ResourceException — при работе с ресурсами (например, через groovy.util.GroovyScriptEngine).
  • groovy.io.FileException — при операциях с файлами в Groovy-стиле.

Все эти исключения наследуются от java.lang.RuntimeException или java.lang.Exception, но в Groovy они всегда ведут себя как непроверяемые.


Особенности модели исключений в Groovy

  • Динамическая природа языка приводит к частым исключениям вида MissingMethodException и MissingPropertyException при опечатках или отсутствии методов/свойств.
  • Операторы-обёртки: например, использование ?. (safe navigation) или ?: (Elvis) помогает избежать NullPointerException.
  • Интеграция с Java: можно перехватывать как Java-, так и Groovy-исключения в одном try/catch.

Пример:

try {
def x = someObject.nonExistentMethod()
} catch (MissingMethodException e) {
println "Метод не найден: ${e.method}"
}

Специфичные и стандартные

Список типов исключений в Groovy включает:

  1. Все исключения Java (IOException, NullPointerException, IllegalArgumentException и т.д.).
  2. Специфичные исключения Groovy, преимущественно из пакета groovy.lang, связанные с динамической природой языка.

Ключевое отличие от Java — отсутствие проверяемых исключений, что упрощает обработку ошибок, но требует большей внимательности при работе с внешними API.