Я знаю о неприятном поведении powershell, касающемся синтаксических ошибок и кодов выхода. У меня есть следующий пример воспроизведения, который должен быть пойман либо ловушкой, либо блоком захвата try, но ни один из них не запускается, даже если $ErrorActionPreference
установлен в stop
.Не удается поймать или уловить ошибку синтаксиса
Этот код здесь держит выход с кодом ошибки 0, что весьма раздражает, как нет механизма ловушки не вызывается дело с ошибкой:
$ErrorActionPreference = "stop"
trap [Exception] {
echo "Trap encountered"
exit(1)
}
Try
{
function foo($path, $path)
{
}
}
Catch
{
echo "Caught something"
exit(1)
}
Знает ли кто, как я могу обмануть PowerShell, чтобы правильно выйти в таких случаях ? Синтаксические ошибки в скриптах нарушают наш CI молча, что довольно проблематично.
Для ясности: Это было проверено и воспроизведены на Win 7 PS 3,0
Edit 2: Для того, чтобы избежать большего числа людей, говоря, что я не буду отлавливать ошибки синтаксиса этим. Powershell разработан с учетом того, что большинство других языков программирования или программирования вы знаете.
Вы можете уловить синтаксические ошибки, поскольку они рассматриваются как завершающие ошибки.
If you make a syntax error or run out of memory, that is a terminating error. Terminating errors can be caught and handled.
для меня это ошибки: "function foo ($ path, $ path) + ~~~~~ Дублировать параметр $ path в списке параметров." – 4c74356b41
В моей системе функция 'powershell -command 'foo ($ a, $ a) {}" 'имеет код выхода из 1, а успешный запуск завершен с 0. Обнаружение ошибки из вашего CI должно быть по крайней мере выполнимо. Если вы действительно хотите обработать это из самого PowerShell, вы можете, конечно, вызывать рекурсивно (blech), или вы можете попытаться использовать ['Parser'] (https://msdn.microsoft.com/library/system.management.automation. language.parser) (начиная с версии 3.0) для анализа любых скриптов перед их выполнением. –
@ 4c74356b41 Он делает, но никакой ловушки не вызывается, и если вы проверите код выхода, это будет 0, независимо от красного текста ошибки. – Samuel