Reputation: 799
I have recently started digging into error handling in Powershell and I noticed something that I do not really understand (I cannot tell where this behaviour is coming from).
I have a simple function, which checks for domain name using [System.Net.DNS]::GetHostByName()
If this variable gets passed a non-existing host, it throws a nasty error
Exception calling "GetHostByName" with "1" argument(s): "No such host is known"
I then want to catch the error and do some cosmetics around it
$Error[0].Exception.InnerException
gives a really nice output:
No such host is known
and nothing else - which I like, and I want it to be the message appearing instead of error.
When I place the above in the catch clause, everything works fine.
But how surprised I was when I saw that putting semicolons, or using Write-host
or in any way converting that to 'string' value, messes up the innerException.
Try it for yourself:
$Error[0].Exception.InnerException
throws"$($Error[0].Exception.InnerException)"
throwsThe first command gives the No such host is known
while the second command gives the complete error.
Please explain me why is this happening?
Finally, I would want the error message to popup:
No such host is known: $computername
. Is there 'easy' way to do this rather than doing bloody regular expressions?
Upvotes: 5
Views: 13484
Reputation: 68273
I believe the difference is which method Powershell is calling to get the output from the object in different circumstances.
When you just output it to the pipeline by using
$error[0].exception.innerexception
it's calling the .GetBaseException()
method, which just outputs the Message property.
When you cast it as [string] to use with Write-Host, it's calling the .tostring()
method, which is outputting all of the error information.
Upvotes: 6
Reputation: 60918
this?
"$($Error[0].Exception.InnerException.message): $computername"
The behaviour you have IMHO is due to the custom formatting file
Upvotes: 2