PowerShell中finally块意外提前执行?该行为是否有官方文档说明?
PowerShell中finally块与Write-Error的执行顺序问题
现象复现
测试脚本:
$ErrorActionPreference = 'Stop' try { qweqweqwe } catch { Write-Error $_ #-ErrorAction Continue } finally { Read-Host -Prompt 'Press enter to continue' } Read-Host -Prompt 'What'
- 默认状态下:
finally块的提示先显示,之后才输出Write-Error的错误信息 - 取消注释
-ErrorAction Continue后:先显示错误信息,再执行finally块,最后进入后续的Read-Host
官方文档说明
该行为在PowerShell官方文档中有明确记录:
Write-Error的终止错误触发规则:当$ErrorActionPreference设为Stop时,Write-Error会生成终止错误,触发当前作用域的退出流程。finally块的执行时机:finally块属于try/catch/finally结构的强制执行部分,无论try或catch块是否正常完成、是否触发终止错误,finally块都会在当前作用域退出前被执行。- 错误输出的延迟逻辑:终止错误的信息输出流程,会在
finally块执行完成后才完成——因为finally是作用域退出前的最后执行步骤,PowerShell会优先保证finally的执行,再处理终止错误的信息展示。
行为解释
- 未添加
-ErrorAction Continue时:Write-Error遵循Stop的全局错误偏好,生成终止错误,触发catch块所在作用域的退出。PowerShell先执行finally块(符合强制执行规则),待finally执行完成后,才输出终止错误的信息,因此出现顺序颠倒的现象。 - 添加
-ErrorAction Continue时:Write-Error被强制设为非终止错误,不会触发作用域退出,catch块可以正常执行完成后再进入finally块,输出顺序符合预期。
内容的提问来源于stack exchange,提问作者Silex
相关产品推荐
相关产品推荐

