Объект Powershell $Error не сразу заполняется внутри модуля PSM1

Я столкнулся со своеобразной проблемой с 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. Таким образом, модуль -уточнения кода меняет поведение распространения ошибок. Может ли кто-нибудь присоединиться к рассуждениям, стоящим за этим?

Я должен отметить, что я могу получить конкретное пойманное исключение через автоматическую переменную $ _,но я хочу получить всю коллекцию в этот момент в стеке вызовов.

8
задан Ethan J. Brown 11 July 2012 в 22:06
поделиться