PowerShell: единственная точка, где я могу поймать все исключения - PullRequest
1 голос
/ 22 февраля 2011

У меня есть несколько файлов сценариев PowerShell. a.ps1 'звонки' (через точечный оператор) b.ps1 и c.ps1 сценарии.

a.ps1    #main
  b.ps1  #helper1 <- need catch error there
  c.ps1  #helper2 <- error is being raised there

Возможно ли в файле b.ps1 отловить завершающую ошибку, выданную в файле c.ps1?

Спасибо.

EDIT

Внутри a.ps1:

. .\b.ps1
. .\c.ps1

Внутри b.ps1:

trap {
  Write-Host "my trap block"
}

Внутри c.ps1:

throw "test"

«Мой блок-ловушка» в этом примере не вызывается

Ответы [ 2 ]

4 голосов
/ 22 февраля 2011

Вы можете установить обработчик trap в b.ps1 для обработки ошибок в c.ps1, если вы поставите точку на источнике b.ps1, чтобы он работал в той же области, что и a.ps1 Например:

. .\b.ps1

Обновление: Действительно, это не работает. Кажется, что PowerShell не соблюдает идею запуска в области a.ps1 с помощью точечного поиска. Не уверен, что вы сможете сделать что-то лучше, чем это:

a.ps1 contents:
---------------
. .\b.ps1

trap {
  TrapHandler $_
  continue
}

.\c.ps1

b.ps1 contents:
---------------
function TrapHandler($error)
{
  Write-Host "oops - $error" 
}

Похоже, что обработчик ловушек должен быть в a.ps1, но вы можете определить функцию обработки ловушек в b.ps1. Тем не менее, не думайте, что вы можете контролировать расположение (прервать или продолжить) ошибки в этой функции.

0 голосов
/ 26 февраля 2011

Это действительно странно.Очевидно, что ловушка не заботится о области действия, точно.

У меня нет правильного решения, но у меня есть странный обходной путь:

Вы могли бы написать это вa:

.([scriptblock]::create(( (gc .\b.ps1 -del `0) + "`n" + (gc .\c.ps1 -del `0) )))

Или то же самое, говоря по-другому:

.( [scriptblock]::create(( @(gc .\b.ps1) + @(gc .\c.ps1) -join "`n" )) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...