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

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

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

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

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

  • 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:

  • groovy.sql.SQLException — обёртка над java.sql.SQLException с улучшенным сообщением.

Из 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.