Skip to content

Commit 7baf667

Browse files
SufficientDaikonclaudesdwheeler
authored
Add about_Error_Handling and fix error terminology across docs (#12890)
* Add about_Error_Handling and fix error terminology across docs Create a comprehensive about_Error_Handling reference topic that documents PowerShell's three error categories: non-terminating, statement-terminating, and script-terminating errors. Correct false claims in about_CommonParameters and about_Preference_Variables that state -ErrorAction and $ErrorActionPreference have "no effect on terminating errors." Update about_Try_Catch_Finally, about_Throw, about_Trap, and everything-about-exceptions to use precise terminology consistent with existing usage in about_Calculated_Properties, about_Pipeline_Chain_Operators, and about_Pwsh. Fixes #1583 * Address mklement0 review: fix error terminology precision - -ErrorAction Stop promotes to script-terminating, not statement-terminating - $ErrorActionPreference applies to both non-terminating and statement-terminating errors (unlike -ErrorAction parameter) - $ErrorActionPreference = 'Ignore' is now accepted (remove outdated caveat) - Native command non-zero exit emits non-terminating NativeCommandExitException Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Comprehensive accuracy overhaul: escalation semantics, asymmetry, parse errors Major corrections verified against PowerShell engine source code: - Fix: -ErrorAction Stop produces script-terminating errors, not statement-terminating. ActionPreferenceStopException sets SuppressPromptInInterpreter=true, causing call-stack unwinding. Fixed across all 4 affected files. - Add: New "$ErrorActionPreference asymmetry" section in about_Error_Handling documenting that $ErrorActionPreference applies to BOTH non-terminating and statement-terminating errors, while -ErrorAction only affects non-terminating errors. Includes runnable demo and IMPORTANT callout for exceptions (SuppressPromptInInterpreter, PS classes, PipelineStoppedException). - Add: Parse errors to script-terminating generators list (per mklement0 review comment). - Fix: about_Preference_Variables Ignore bullet incorrectly stated "Ignore isn't a valid value for $ErrorActionPreference" — it is accepted (only Suspend is rejected per ExecutionContext.cs). - Fix: NOTE block on ThrowTerminatingError now correctly explains that $ErrorActionPreference can suppress it via the engine's statement-level handler in MiscOps.CheckActionPreference. - Fix: Summary table updated — -ErrorAction Stop moved from statement-terminating to script-terminating column, new row added for $ErrorActionPreference behavior per error type. - Fix: everything-about-exceptions.md — three remaining instances of vague "terminating error" updated to "script-terminating error" for throw and -ErrorAction Stop contexts. All claims verified with live PowerShell 7.x tests: 1. -ErrorAction Stop: next statement in scriptblock does NOT run (script-terminating) 2. Parse errors: caught as MethodInvocationException 3. $ErrorActionPreference='Ignore': accepted without error 4. $ErrorActionPreference='SilentlyContinue': suppresses ThrowTerminatingError 5. -ErrorAction SilentlyContinue: does NOT suppress ThrowTerminatingError Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Address mklement0 feedback: throw suppression, Ignore/$Error, advanced escalation Three corrections based on mklement0's review: 1. throw CAN be suppressed by $ErrorActionPreference when set to SilentlyContinue or Ignore. Removed the incorrect claim that throw is "always" script-terminating "regardless of $ErrorActionPreference". Also documented that -ErrorAction on advanced functions translates to a scope-local $ErrorActionPreference, so it suppresses throw too. 2. Added NOTE that $ErrorActionPreference = 'Ignore' still records terminating errors in $Error. Ignore only prevents $Error recording for non-terminating errors. 3. Escalation section now documents the advanced vs. non-advanced distinction: $ErrorActionPreference = 'Stop' produces script-terminating errors in non-advanced contexts, but statement-terminating errors in advanced contexts ([CmdletBinding()]). Summary table updated to reflect both contexts. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Refine escalation terminology: terminating (context-dependent) not script-terminating Per mklement0 feedback, -ErrorAction Stop escalation scope depends on whether the context is advanced ([CmdletBinding()]) or non-advanced. Changed about_CommonParameters.md and ErrorAction table to say "terminating error" generically, with escalation section providing the full advanced vs. non-advanced explanation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Extend error handling accuracy to about_Throw, about_Try_Catch_Finally - about_Throw: Add $ErrorActionPreference suppression caveat (throw CAN be suppressed by SilentlyContinue/Ignore), add NOTE block with Ignore still recording in $Error, update description to "by default" - about_Try_Catch_Finally: Add NOTE about throw suppression with cross-ref to about_Error_Handling, fix $tempPath -> $tempFile code bug (line 264) - about_Preference_Variables: Fix Ignore bullet - clarify that Ignore only prevents $Error recording for non-terminating errors, not terminating - everything-about-exceptions: Change -ErrorAction Stop from "script-terminating" to "terminating" (context-dependent behavior) All claims verified against live PowerShell 7.6 behavior. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Final polish: qualify Ignore/$Error claims and About.md index - About.md: Update throw index to "script-terminating error by default" - about_Automatic_Variables: Qualify $Error/Ignore as non-terminating only - about_CommonParameters: Qualify Ignore bullet as non-terminating only Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Add about_Error_Handling to index; fix stale descriptions and dates - About.md: Add missing about_Error_Handling entry to topic index - About.md: Update about_Trap and about_Try_Catch_Finally descriptions to say "statement-terminating and script-terminating errors" - about_Try_Catch_Finally.md: Fix [07] link text to match target heading - Update ms.date on about_Trap, about_CommonParameters, about_Preference_Variables, everything-about-exceptions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Editorial changes - mostly formatting * Copy changes to all versions --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Sean Wheeler <sean.wheeler@microsoft.com>
1 parent 40d69ff commit 7baf667

30 files changed

+2800
-278
lines changed

reference/5.1/Microsoft.PowerShell.Core/About/about_Automatic_Variables.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
description: Describes variables that store state information for PowerShell. These variables are created and maintained by PowerShell.
33
Locale: en-US
4-
ms.date: 02/10/2026
4+
ms.date: 04/02/2026
55
no-loc: [Reset, Current, Background, Blink, Bold, Foreground, Formatting, Hidden, Italic, Reset, Reverse, Underline, PSEventArgs, PSEventSubscriber, PSEdition]
66
online version: https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-5.1&WT.mc_id=ps-gethelp
77
schema: 2.0.0
@@ -160,8 +160,8 @@ use this automatic variable to determine the file to update.
160160
Contains an array of error objects that represent the most recent errors. The
161161
most recent error is the first error object in the array `$Error[0]`.
162162

163-
To prevent an error from being added to the `$Error` array, use the
164-
**ErrorAction** common parameter with a value of **Ignore**. For more
163+
To prevent a non-terminating error from being added to the `$Error` array, use
164+
the **ErrorAction** common parameter with a value of **Ignore**. For more
165165
information, see [about_CommonParameters][53].
166166

167167
### `$Event`

reference/5.1/Microsoft.PowerShell.Core/About/about_CommonParameters.md

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
description: Describes the parameters that can be used with any cmdlet.
33
Locale: en-US
4-
ms.date: 01/18/2026
4+
ms.date: 04/02/2026
55
no-loc: [Confirm, Debug, ErrorAction, ErrorVariable, InformationAction, InformationVariable, OutBuffer, OutVariable, PipelineVariable, ProgressAction, Verbose, WarningAction, WarningVariable, WhatIf]
66
online version: https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_commonparameters?view=powershell-5.1&WT.mc_id=ps-gethelp
77
schema: 2.0.0
@@ -109,14 +109,13 @@ the display of debugging messages when `$DebugPreference` isn't
109109
### -ErrorAction
110110

111111
Determines how the cmdlet responds to a non-terminating error from the command.
112-
This parameter works only when the command generates a non-terminating error,
113-
such as those from the `Write-Error` cmdlet.
112+
This parameter overrides the value of the `$ErrorActionPreference` variable for
113+
non-terminating errors generated by the command or the `Write-Error` cmdlet.
114114

115115
```yaml
116116
Type: ActionPreference
117117
Aliases: ea
118-
Accepted values: Suspend, Ignore, Inquire, Continue, Stop, SilentlyContinue
119-
118+
Accepted values: Break, Suspend, Ignore, Inquire, Continue, Stop, SilentlyContinue
120119
Required: False
121120
Position: Named
122121
Default value: Depends on preference variable
@@ -129,9 +128,12 @@ variable for the current command. Because the default value of the
129128
`$ErrorActionPreference` variable is `Continue`, error messages are displayed
130129
and execution continues unless you use the `ErrorAction` parameter.
131130

132-
The `ErrorAction` parameter has no effect on terminating errors (such as
133-
missing data, parameters that aren't valid, or insufficient permissions) that
134-
prevent a command from completing successfully.
131+
The `-ErrorAction` parameter doesn't prevent statement-terminating errors
132+
(such as missing data, parameters that aren't valid, or insufficient
133+
permissions) from stopping the current statement. However, when set to `Stop`,
134+
it escalates non-terminating errors to script-terminating errors, making them
135+
catchable by `try/catch`. For more information about error categories, see
136+
[about_Error_Handling][15].
135137

136138
- `-ErrorAction:Break` Enters the debugger when an error occurs or an exception
137139
is raised.
@@ -829,6 +831,7 @@ Mode LastWriteTime Length Name
829831

830832
<!-- Using backtick on cmdlet names to avoid localization -->
831833
- [about_Preference_Variables][03]
834+
- [about_Error_Handling][15]
832835
- [`Write-Debug`][11]
833836
- [`Write-Error`][12]
834837
- [`Write-Verbose`][13]
@@ -844,4 +847,5 @@ Mode LastWriteTime Length Name
844847
[12]: xref:Microsoft.PowerShell.Utility.Write-Error
845848
[13]: xref:Microsoft.PowerShell.Utility.Write-Verbose
846849
[14]: xref:Microsoft.PowerShell.Utility.Write-Warning
850+
[15]: about_Error_Handling.md
847851

0 commit comments

Comments
 (0)