Question:
Why I get error message printed on the console when running these two simple samples ?
I want that I get “Error testing :)” printed on the console insted of:
Get-WmiObject : The RPC server is
unavailable. (Exception from HRESULT:
0x800706BA) At line:3 char:15
+ Get-WmiObject <<<< -ComputerName possibly.nonexisting.domain.com
-Credential (Get-Credential) -Class Win32_logicaldisk
+ CategoryInfo : InvalidOperation: (:) [Get-WmiObject],
COMException
+ FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
or
Attempted to divide by zero. At line:3
char:13
+ $i = 1/ <<<< 0
+ CategoryInfo : NotSpecified: (:) [],
ParentContainsErrorRecordException
+ FullyQualifiedErrorId : RuntimeException
First example:
1 2 3 4 5 6 7 8 9 10 |
try { $i = 1/0 Write-Host $i } catch [Exception] { Write-Host "Error testing :)" } |
Second example:
1 2 3 4 5 6 7 8 9 |
try { Get-WmiObject -ComputerName possibly.nonexisting.domain.com -Credential (Get-Credential) -Class Win32_logicaldisk } catch [Exception] { Write-Host "Error testing :)" } |
Thank you very much!
Answer:
First example
The error happens at compile/parsing time (PowerShell is clever enough), so that the code is not even executed and it cannot catch anything, indeed. Try this code instead and you will catch an exception:
1 2 3 4 5 6 7 8 9 10 11 |
try { $x = 0 $i = 1/$x Write-Host $i } catch [Exception] { Write-Host "Error testing :)" } |
Second example
If you set $ErrorActionPreference = 'Stop'
globally then you will get “Error testing :)” printed, as expected. But your $ErrorActionPreference
is presumably 'Continue'
: in that case there is no terminating error/exception and you just get the non terminating error message printed to the host by the engine.
Instead of the global $ErrorActionPreference
option you can also play with Get-WmiObject
parameter ErrorAction
. Try to set it to Stop
and you will catch an exception.
1 2 3 4 5 6 7 8 9 |
try { Get-WmiObject -ErrorAction Stop -ComputerName possibly.nonexisting.domain.com -Credential (Get-Credential) -Class Win32_logicaldisk } catch [Exception] { Write-Host "Error testing :)" } |