#groovy #jenkins-pipeline #jenkins-groovy
#groovy #Дженкинс-конвейер #дженкинс-заводной
Вопрос:
Есть ли способ улавливать ошибки NoSuchMethodError, когда код groovy вызывает метод, который не существует?
Следующий код вызывает ошибку NoSuchMethodError, которая не улавливается, но блок finally выполняется. Это вызывает проблемы с некоторыми моими обработками ошибок и отчетами.
Код с поддельным dsl
try {
println "in try"
dslDoesNotExist()
} catch (Exception ex) {
println "Caught error ${ex}"
throw ex
} finally {
println "finally block"
}
Результат
in try
[Pipeline] echo
finally block // see the finally but not the catch
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.lang.NoSuchMethodError: No such DSL method 'dslDoesNotExist'
Если я изменяю код, собирающийся ссылаться на свойство / переменную, которая не существует, блок catch обрабатывается
Код с отсутствующим свойством
try {
println "in try"
propertyOrVariableDoesNotExist
} catch (Exception ex) {
println "Caught error ${ex}"
throw ex
} finally {
println "finally block"
}
Результат
in try
[Pipeline] echo
Caught error groovy.lang.MissingPropertyException: No such property: propertyOrVariableDoesNotExist for class: WorkflowScript
[Pipeline] echo
finally block
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
hudson.remoting.ProxyException: groovy.lang.MissingPropertyException: No such property: propertyOrVariableDoesNotExist for class:
Что здесь происходит
Java против исключений Groovy?
Может ли CPS groovy catch (Exception ex) перехватывать java.lang. исключения? НЕТ
Код
try {
throw new java.lang.NoSuchMethodError("dsl problem")
} catch (Exception ex) {
println "Caught"
}
Результат
// No evidence of the catch
[Pipeline] { (hide)
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.lang.NoSuchMethodError: dsl problem
Комментарии:
1. Каков контекст для этого кода? Это библиотека, глобальная переменная, блок сценариев или собственный скриптовый DSL? Где бы вы ожидали, что метод будет определен нормально? Обратите внимание также, что вы пытаетесь поймать исключение Java в Groovy в первом неудачном примере и исключение Groovy в Groovy во втором успешном примере.
2. Контекст заключается в том, что код загружает исходный код из другого репозитория. Если бы в выбранной ветви репозитория отсутствовал метод, то мы столкнулись бы с этой проблемой. Я думал, что catch поймает все, но это не так
3. Я также пробовал catch(java.lang. NoSuchMethodError){…}, которые также не сработали.
Ответ №1:
Спасибо @jeff-scott-brown, поскольку он был прав. Потребовалось некоторое копание и эксперименты, чтобы понять это. Я ошибся.
Происхождение NoSuchMethodError выглядит следующим образом
java.lang.Object
java.lang.Throwable
java.lang.Error
java.lang.LinkageError
java.lang.IncompatibleClassChangeError
java.lang.NoSuchMethodError
Происхождение Groovy Exception является
java.lang.Throwable
java.lang.Exception
org.codehaus.groovy.GroovyException
Итак, если я переработаю код до этого, он будет работать так, как ожидалось. Когда я изначально тестировал это, я столкнулся с ошибкой изолированной среды безопасности, которая запутала результаты, и я пропустил ее (это было очевидно, поэтому я не знаю, как я это пропустил, но я сделал)
Код
try {
dslNotExist()
} catch (java.lang.Throwable ex) {
println "Caught"
}
Результат
[Pipeline] {
[Pipeline] echo
Caught
[Pipeline] }
[Pipeline] // node