Managing non-terminating errors

Managing non-terminating errors

Rate This
  • Comments 3

Most errors which occur in your working scripts are likely to be "non-terminating".  This means that Monad just reports the error and the command keeps running.  ("Terminating" errors such as syntax errors will halt the command and, in some cases, the entire script; see http://blogs.msdn.com/monad/archive/2005/11/15/493102.aspx for more details.). 

This Blog describes how to handle non-terminating errors.  You may choose to modify the action that occurs when a non-terminating error occurs or you may choose to collect non-terminating errors in a variable.  If you collect non-terminating errors in a variable, your script can check to see if any the prior command emitted any non-terminating errors.

Consider:

MSH C:\temp\monad> remove-item nosuchfile.txt;write-host "done"
remove-item : Cannot find path 'C:\temp\monad\nosuchfile.txt' because it does not exist.
At line:1 char:12
+ remove-item  <<<< nosuchfile.txt;write-host "done"
done
MSH C:\temp\monad>
 

Even though the file was not found, the script just kept on running.  This is often the case with scripts which are syntactically correct but encounter operational errors.  So, what can you do to cause a script to react to problems it might encounter?

(1) -ErrorAction 

You can change how Monad reacts to non-terminating errors with the "-ErrorAction" ubiquitous parameter ("-ea" is the alias).  Your options are SilentlyContinue, Continue, Stop, and Inquire (also see http://blogs.msdn.com/monad/archive/2005/11/11/491967.aspx):

  • "SilentlyContinue": Do not print, continue
  • "Continue": Print, continue (this is the default)
  • "Stop": Halt the command or script
  • "Inquire": Ask the user what to do

You can suppress printing errors for a specific cmdlet with "-ea SilentlyContinue", or in general with "$ErrorActionPreference = "SilentlyContinue"".  You can cause non-terminating errors to become terminating (the type will be ActionPreferenceStopException) with "-ea Stop" or "$ErrorActionPreference = "Stop"".

MSH C:\temp\monad> remove-item nosuchfile.txt -ea Stop
remove-item : Command execution stopped because the shell variable "ErrorActionPreference" is set to Stop: Cannot find path 'C:\temp\monad\nosuchfile.txt' because it does not exist.
At line:1 char:12
+ remove-item  <<<< nosuchfile.txt -ea Stop
MSH C:\temp\monad> remove-item nosuchfile.txt -ea SilentlyContinue
MSH C:\temp\monad>

(2)  -ErrorVariable

You can save off the non-terminating errors to a shell variable using the "-ErrorVariable" ubiquitous parameter ("-ev" is the parameter alias).  This is not affected by "-ErrorAction".

MSH C:\temp\monad> get-content errorvariable.msh
remove-item foo.txt -ErrorVariable errs -ErrorAction SilentlyContinue
if ($errs.Count -eq 0)
{
    write-host "ran fine"
}
else
{
    write-host "failed"
}
MSH C:\temp\monad> .\errorvariable.msh
failed
MSH C:\temp\monad>

You can also append failures to an existing ErrorVariable by prepending "+" to the variable name.  This even works for multiple cmdlets in the same pipeline appending to the same ErrorVariable.

MSH C:\temp\monad> gc errorvariable.msh
$ErrorActionPreference = "SilentlyContinue"

remove-item nosuchfile.txt -ErrorVariable errs
remove-item nosuchfile2.txt -ErrorVariable +errs
$errs.Count
MSH C:\temp\monad> .\errorvariable.msh
2

 

[Edit: Monad has now been renamed to Windows PowerShell. This script or discussion may require slight adjustments before it applies directly to newer builds.]

Leave a Comment
  • Please add 8 and 6 and type the answer here:
  • Post
  • There are three variables that maintain error information. $error = maintains the last x number of errors

  • PingBack from http://mariuszgal.com/blog/?p=12

  • This doesn't seem to work for Warnings however.  If I run the Get-Mailbox -Identity "zzzzzzz" | Get-Member, and there are mailboxes that are "UM" enabled on Exchange 2007 but do not have a primary UM Address, such as is the case when a user leaves the company, I get a yellow warning message about each account that matches this set of parameters before I get to see the output of my command.  I would have thought that -ErrorAction SilentlyContinue would have masked the warnings but alas it does not.  Any ideas?

Page 1 of 1 (3 items)