Почему Power Groove выводит сообщения об ошибках дважды?

$ groovy -e 'assert 1 == 2'
Caught: Assertion failed: 

assert 1 == 2
         |
         false

Assertion failed: 

assert 1 == 2
         |
         false

        at script_from_command_line.run(script_from_command_line:1)

Почему это происходит? Как можно отключить / настроить это?

Получение выходных данных дважды слегка раздражает, когда я работаю над простым сценарием и хочу в конце написать несколько утверждений и выполнить / протестировать сценарий в Vim с помощью !groovy %

1 ответ

Решение

Скорее поздно, но, для чего это стоит..., а также для потомков:)

Обратите внимание на префикс Caught: при первом появлении сообщения. Когда скрипт выдает исключение (которое не перехватывается), по умолчанию groovy печатает (в stderr) этот префикс, исключение toString() и его трассировка стека, а затем он выходит.

Таким образом, я бы сказал, что первое вхождение сообщения представляет "поведение по умолчанию" / обработку ошибок для необработанных исключений, а второе - из-за "специальной" обработки PowerAssertionErrorс / assert Ключевое слово в Groovy, то есть просто печать ошибки toString(),

Используя такой метод, как ok() ниже проверяется эта "теория", а также дается возможное решение проблемы двойного сообщения:

def ok(assertion) {
    try {
        assert assertion
    } catch(AssertionError assertionError) {
        System.err.println(assertionError)
    }
}

Насколько я видел, это все еще поведение в Groovy 2.5.0.

РЕДАКТИРОВАТЬ

К сожалению, с помощью метода ok() выше, как ok 1 == 2вы теряете наиболее значимую информацию о неверном утверждении, так как вывод становится чем-то вроде строки:

Assertion failed:

assert assertion
       |
       false

Лучшим решением (или, скорее, обходным путем) было бы обернуть утверждение в замыкание и передать его ok() метод:

def ok(Closure<?> assertionExp) {
    try {
        assertionExp?.call()
    } catch(AssertionError assertionError) {
        System.err.println(assertionError)
    }
}

С помощью ok() будет выглядеть так:

ok { assert 1 == 2 }

Выход на выходе:

Assertion failed:

assert 1 == 2
         |
         false
Другие вопросы по тегам