PowerShell 2.0 и как обрабатывать исключения?

почему я получаю сообщение об ошибке печатается на консоль при выполнении этих двух простых примеров ? Я хочу, чтобы я получил "Error testing:)", напечатанный на консоли insted of:

Get-WmiObject: сервер RPC недоступный. (Исключение из HRESULT: 0x800706BA) в строке: 3 char:15 + Get-WmiObject

или

попытка деления на ноль. На линии:3 char: 13 + $i = 1/ + CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId: RuntimeException

первый пример:

try
{
    $i = 1/0   
    Write-Host $i     
}
catch [Exception]
{ 
    Write-Host "Error testing :)" 
}

1 ответов


первый пример

ошибка происходит во время компиляции/синтаксического анализа (PowerShell достаточно умен), так что код даже не выполняется, и он ничего не может поймать. Попробуйте этот код, и вы поймаете исключение:

try
{
    $x = 0
    $i = 1/$x
    Write-Host $i
}
catch [Exception]
{
    Write-Host "Error testing :)"
}

второй пример

если вы устанавливаете $ErrorActionPreference = 'Stop' глобально, тогда вы получите" тестирование ошибок:)", как и ожидалось. Но ваш $ErrorActionPreference предположительно 'Continue': в этом случае нет завершающей ошибки / исключения, и вы просто получаете сообщение об ошибке, напечатанное на хосте двигателем.

вместо глобального вы также можете играть с Get-WmiObject параметр ErrorAction. Попробуйте установить его в Stop и вы поймаете исключение.

try
{
    Get-WmiObject -ErrorAction Stop -ComputerName possibly.nonexisting.domain.com -Credential (Get-Credential) -Class Win32_logicaldisk
}
catch [Exception]
{
    Write-Host "Error testing :)"
}