LightningWar
LightningWar

Reputation: 975

Error action not stopping script

Consider this simple code:

Read-Host $path
try { 
    Get-ChildItem $Path -ErrorAction Continue
}

Catch {
     Write-Error "Path does not exist: $path" -ErrorAction Stop
     Throw
}

Write-Output "Testing"

Why is 'Testing' printed to the shell if an invalid path is specified?

The script does not stop in the catch block. What am I doing wrong?

Upvotes: 2

Views: 2868

Answers (2)

Sage Pourpre
Sage Pourpre

Reputation: 10323

In your Try Catch block, you need to set Get-ChildItem -ErrorAction Stop so the exception is caught in the Catch block.

With continue, you are instructing the command to not produce a terminating error when an actual error occurs.

Edit: Also, your throw statement is useless there and you do not need to specify an error-action for Write-Error.

Here's the modified code.

$path = Read-Host

try { 
   Get-ChildItem $Path -ErrorAction stop 
}

Catch {
     Write-Error "Path does not exist: $path" 
}

Additional note

You could apply this default behavior (if that is what you want) to the entire script by setting the default action to stop using :

$ErrorActionPreference = [System.Management.Automation.ActionPreference]::Stop

Upvotes: 2

Mark Wragg
Mark Wragg

Reputation: 23355

I think this is what you need:

$path = Read-Host 'Enter a path'

try { 
    Get-ChildItem $Path -ErrorAction Stop
} 
Catch {
    Throw "Path does not exist: $path"
}

Write-Output "Testing"

Per Sage's answer, you need to change to -ErrorAction Stop in the Try block. This forces the Get-ChildItem cmdlet to throw a terminating error, which then triggers the Catch block. By default (and with the Continue ErrorAction option) it would have thrown a non-terminating error which are not caught by a try..catch.

If you then want your code to stop in the Catch block, use Throw with the message you want to return. This will produce a terminating error and stop the script (Write-Error -ErrorAction Stop will also achieve a terminating error, it's just a more complicated method. Typically you should use Write-Error when you want to return non-terminating error messages).

Upvotes: 0

Related Questions