0

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?

2

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.
| improve this answer | |
  • That's very good answer. But I have a quesiton: I think this method is not working with non-shell built-in commands like ffmpeg. Because after a unsucessful process with ffmpeg, script can continue to the next commands. Is there a way to stop this too? Thank you. – Ahmet Mehmet Mar 26 at 16:44
  • @SerhatÇelik I don't have such a program to test this right now, but you can test if it works if you set $ErrorActionPreference = "Stop" before the Try/Catch block and set it to $ErrorActionPreference = "Continue" again afterwards – SimonS Mar 27 at 7:46

Your Answer

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.