Почему 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