Jenkins cps groovy не улавливает исключения noSuchMethod Error

#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