PowerShell 2.0 и как обрабатывать исключения? - PullRequest
7 голосов
/ 14 января 2011

Почему я получаю сообщение об ошибке на консоли при запуске этих двух простых примеров?Я хочу, чтобы на консоли было напечатано «Ошибка тестирования :)»:

Get-WmiObject: сервер RPC недоступен.(Исключение из HRESULT: 0x800706BA) В строке: 3 символа: 15 + Get-WmiObject <<<< -ComputerName возможно.nonexisting.domain.com -Credential (Get-Credential) -Class Win32_logicaldisk + CategoryInfo: InvalidOperation: (:) [Get-WmiObject], COMException + FullyQualifiedErrorId: GetWMICOMException, Microsoft.PowerShell.Commands.GetWmiObjectCommand </p>

или

Попытка деления на ноль.В строке: 3 символа: 13 + $ i = 1 / <<<< 0 <br>+ CategoryInfo: NotSpecified: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId: RuntimeException

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

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

Второй пример:

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

Большое спасибо!

1 Ответ

11 голосов
/ 14 января 2011

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

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

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

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

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

Вместо глобальной опции $ErrorActionPreference вы также можете играть с параметром 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 :)"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...