Question:
If I have a piece of code that throws an exception I get an error message, but I have no idea how to correctly catch (or determine) the exception that is being thrown. Normally I’ll just catch System.Exception
which is a bad idea.
Here is an example… I’m trying to create a folder on a drive that doesn’t exist:
1 2 3 4 5 6 7 8 9 10 |
PS mkdir : Cannot find drive. A drive with the name 'z' does not exist. At + mkdir $args[0] 1> $null + ~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (z:String) [New-Item], DriveNotFoundExc eption + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.NewItemComm and |
I’ve tried catching System.DriveNotFoundException
, but rerunning my script still produces the uncaught exception.
Are there any tips as to effectively handling any type of exception?
Answer:
Right after running the command inspect the contents of $error[0]. Look at the Exception property e.g.:
1 2 3 4 5 6 7 8 9 10 |
$error[0] | fl * -force writeErrorStream : True PSMessageDetails : Exception : System.Management.Automation.DriveNotFoundException: Cannot find drive. A drive with the name 'z' does not exist. at System.Management.Automation.SessionStateInternal.GetDrive(String name, Boolean automount) at System.Management.Automation.SessionStateInternal.GetDrive(String name, Boolean |
That particular exception would be [System.Management.Automation.DriveNotFoundException]
.
BTW if you want to “catch” that exception, you will need to convert the non-terminating error into a terminating error using -EA Stop in order for it to generate an exception that you can catch e.g.:
1 2 3 |
PS> try {mkdir z:\foo -ea Stop} catch {$_.Exception.GetType().FUllname} System.Management.Automation.DriveNotFoundException |