Understanding $ErrorView

by Feb 24, 2020

When PowerShell encounters a problem, it displays a rather lengthy error message:

 
PS> 1/0
Attempted to divide by zero.
At line:1 char:1
+ 1/0
+ ~~~
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

In real life, you often just need the first line, and as early as in 2006, the PowerShell team added a preference variable called $ErrorView that can control the way how error messages display. When you assign the “CategoryView” value, this shortens error messages considerably:


 
PS> $ErrorView = 'CategoryView'

PS> 1/0
NotSpecified: (:) [], RuntimeException

PS>   

Unfortunately, this did not really work well because the one line failed to combine the truly important information, and you can assign the “NormalView” value to return to the default view. Coincidentally, this lack of usefulness is why most people never heard about $ErrorView.

Fortunately, in PowerShell 7 (introduced in RC1), the team remembered and finally fixed this. To not break compatibility, they chose to add a third option: ConciseView. Now, the one-liner error message works right and displays all information a typical user would need to know:


 
PS> $ErrorView = ConciseView

PS> 1/0
RuntimeException: Attempted to divide by zero.

PS>   

As a PowerShell developer, simply switch back to “NormalView” to see the rest of the error message. Or – even better – run Get-Error -Newest 1 to get detailed information about the latest error:


 
PS C:\> 1/0
  RuntimeException: Attempted to divide by zero. 
  PS C:\> Get-Error -Newest 1
  
  Exception            : 
    Type         : System.Management.Automation.RuntimeException
    ErrorRecord  :
        Exception            :
            Type  : System.Management.Automation.ParentContainsErrorRecordException 
            Message : Attempted to divide by zero. 
            HResult : -2146233087 
        CategoryInfo         : NotSpecified: (:) [], ParentContainsErrorRecordException 
        FullyQualifiedErrorId : RuntimeException 
        InvocationInfo      :      
            ScriptLineNumber : 
            OffsetInLine    : 1  
            HistoryId      : -1 
            Line            : 1/0  
            PositionMessage : At line:1 char:1
                               + 1/0 
                               + ~~~  
            CommandOrigin  : Internal 
        ScriptStackTrace     : at <ScriptBlock>, <No file>: line 1    
    TargetSite    :
        Name         : Divide 
        DeclaringType : System.Management.Automation.IntOps, System.Management.Automation, Version=7.0.0.0,  
  Culture=neutral, PublicKeyToken=31bf3856ad364e35
        MemberType  : Method 
        Module      : System.Management.Automation.dll  
    StackTrace    : 
    at System.Management.Automation.IntOps.Divide(Int32 lhs, Int32 rhs)
    at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
    at System.Management.Automation.Interpreter.DynamicInstruction`3.Run(InterpretedFrame frame)
    at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
    Message      : Attempted to divide by zero. 
    Data         : System.Collections.ListDictionaryInternal
    InnerException :
        Type    : System.DivideByZeroException
        Message : Attempted to divide by zero. 
        HResult : -2147352558 ;
    Source       : System.Management.Automation 
    HResult      : -2146233087   
  CategoryInfo          : NotSpecified: (:) [], RuntimeException 
  FullyQualifiedErrorId : RuntimeException 
  InvocationInfo    : 
    ScriptLineNumber: 1
    OffsetInLine    : 1
    HistoryId       : -1
    Line            : 1/0 
    PositionMessage : At line:1 char:1
                       + 1/0 
                       + ~~~ 
    CommandOrigin  : Internal 
  ScriptStackTrace     : at <ScriptBlock>, <No file>: line 1 

 


You are a PowerShell Professional, passionate about improving your code and skills? You take security seriously and are always looking for the latest advice and guidance to make your code more secure and faster? You’d love to connect to the vibrant PowerShell community and get in touch with other PowerShell Professionals to share tricks and experience? Then PowerShell Conference EU 2020 might be just the right place for you: https://psconf.eu (June 2-5, 2020 in Hanover, Germany).

It’s a unique mixture of classic conference with three parallel tracks filled with fast-paced PowerShell presentations, and advanced learning class with live discussions, Q&A and plenty of networking.

Secure your seat while they last: https://psconf.eu/register.html. The speakers and agenda is available here: https://psconf.eu/schedule.

Twitter This Tip! ReTweet this Tip!