Я столкнулся со своеобразной проблемой с Powershell. Я перехватываю исключение в блоке catch, но глобальный объект $Error не заполняется.
Тривиальный пример, где это будет вести себя так, как ожидалось, это:
function Bar
{
Foo
}
function Foo
{
try
{
$Error.Clear()
throw "Error!"
}
catch
{
"Caught an error - current error count $($Error.Count)"
}
finally
{
"Cleaning up - current error count $($Error.Count)"
}
}
Вывод такой, как вы ожидаете, если вы вызовете Bar
Caught an error - current error count 1
Cleaning up - current error count 1
Код, с которым у меня возникли проблемы, почти идентичен, за исключением того, что он загружает Foo из модуля. Не уверен, что это ошибка или просто что-то, чего я не понимаю (, придется проверить мою книгу Powershell в действии!)
Если я сохраню Foo в модуль -Foo.psm1
function Foo
{
try
{
$Error.Clear()
throw "Error!"
}
catch
{
"Caught an error - current error count $($Error.Count)"
}
finally
{
"Cleaning up - current error count $($Error.Count)"
}
}
Export-ModuleMember -Function Foo
Затем я выполняю следующее
Import-Module.\Foo.psm1
$Error.Clear()
"Current error count $($Error.Count)"
Foo
"Current error count $($Error.Count)"
Я получаю
Current error count 0
Caught an error - current error count 0
Cleaning up - current error count 0
Current error count 1
Обратите внимание, что Foo больше не видит никаких изменений, внесенных в $Error. Таким образом, модуль -уточнения кода меняет поведение распространения ошибок. Может ли кто-нибудь присоединиться к рассуждениям, стоящим за этим?
Я должен отметить, что я могу получить конкретное пойманное исключение через автоматическую переменную $ _,но я хочу получить всю коллекцию в этот момент в стеке вызовов.