Why Do Commands in Try/Catch Sometimes Need -Erroraction Stop and Sometimes Not?

In the example below I want to catch the Error with -ErrorAction Stop. It worked perfectly in this case.

try
{
    Import-Module -ErrorAction Stop -Force nomodule.psm1
}
catch
{
    Write-Host -ForegroundColor Red "no module"

    $PSItem >> $env:HOMEPATH\AVSUB.log
    exit 1
}

But in the case below, I did not use -ErrorAction Stop and the catch block still ran.

try
{
    $var= broken_function
}
catch
{
   Write-Host -ForegroundColor Red "error"

   $PSItem >> $env:HOMEPATH\AVSUB.log
   exit 1
}

Why do I sometimes need to specify -ErrorAction Stop and sometimes not?

1 Answer

There are Terminating and Non-Terminating Errors in PowerShell.

A terminating error is an error that halts the execution of a cmdlet, script or program. This will be caught by Try {} Catch {} without the need of -ErrorAction Stop.

Non-terminating errors allow PowerShell to continue the execution. You can catch them, by adding -ErrorAction Stop.

Here are two functions, one produces a terminating error, the other a non-terminating error.

# This will throw a terminating error
function TerminatingErrorExample {
    [CmdletBinding()]
    Param()
    Throw "I can't run like this!"
    Write-Host "This message will never be displayed, because it's after the terminating error."
}

# This will write a non-terminating error
function NonTerminatingErrorExample {
    [CmdletBinding()]
    Param($i = 5)
    if ($i -gt 4) {
        Write-Error "I expected a value less or equal to 4!"
    }
    Write-Host "However, I can still continue the execution"
}

If you're curious as to why I used [CmdletBinding()] in the functions, it's because without that, functions don't support [<CommonParameters>], and -ErrorAction Stop is a CommonParameter.

Now we can wrap them in Try {} Catch {}

# Because the function produces a terminating error, the Catch block will run
Try {
    TerminatingErrorExample
} Catch {
    Write-Host "I got you!"
}

# Since the error here is non-terminating, the catch block won't run
Try {
    NonTerminatingErrorExample
} Catch {
    Write-Host "You won't see this message"
}

# Now the catch block will run, because we specifically say we want it to stop,
# even on a non-terminating error.
Try {
    NonTerminatingErrorExample -ErrorAction Stop
} Catch {
    Write-Host "Now you see this message."
}

If we run this, the return will look just like expected:

I got you!
NonTerminatingErrorExample : I expected a value less or equal to 4!
In Zeile:28 Zeichen:5
+     NonTerminatingErrorExample
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,NonTerminatingErrorExample

However, I can still continue the execution
Now you see this message.
2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Sophia Al-Mansoor

Sophia Al-Mansoor

Global Business & E-Commerce Reporter

Sophia analyzes international trade, startup ecosystems, retail transformation, and supply chain logistics for modern digital publications.

Share this article
Twitter Facebook Pinterest