首页/系统/Windows 运维速查/try/catch/finally 结构化错误处理
PowerShell 基础66 条

try/catch/finally 结构化错误处理

捕获并处理错误:catch 用 $_ 拿错误对象、finally 做清理;需配合 -ErrorAction Stop 才能兜住非终止错误。

Windows 运维速查系统更新于 2026-10-13

try/catch 是什么

try 与 catch 组合用来捕获并处理可预期错误:把可能出错的操作放进 try 块,出错后由 catch 块接管,finally 块无论成败都会执行,适合做收尾清理。这里有一个必须记住的前提——非终止错误不会触发 catch,需要给命令加上把错误升级为终止错误的参数,或者在整个脚本层面把错误行为设成终止,异常处理才会真正生效。理解这一点,就不会写出「明明报错了却没进 catch」的脚本。

基本信息

适用平台Windows PowerShell 5.1 与 PowerShell 7 及以上
语法try { 操作 } catch [错误类型] { 处理 } finally { 收尾 }
关键前提非终止错误需升级为终止错误才会触发捕获
错误对象catch 块里的当前对象是错误记录,含异常对象与分类信息
分类捕获可按异常类型写多个 catch 块,按类型匹配处理
收尾块finally 无论是否发生错误都会执行

典型使用场景

  • 访问外部资源失败时给出明确提示,而不是抛出整屏错误
  • 批量操作中隔离单点失败,让其余对象继续处理
  • 按错误类型分流:权限问题与路径问题给出不同处置建议
  • 在收尾块里释放资源,如关闭连接、删除临时文件
  • 把错误写入日志文件,便于事后分析
  • 在脚本入口统一包装,保证异常时也能输出有用的上下文

常用示例

常用示例
# 基本结构:错误升级为终止错误才会被捕获
try {
  Get-Item D:\nope -ErrorAction Stop
} catch {
  Write-Warning $_.Exception.Message
} finally {
  '清理完成'
}
# 按异常类型分别处理
try {
  Copy-Item D:\Src\a.txt D:\Locked\a.txt -ErrorAction Stop
} catch [System.IO.DirectoryNotFoundException] {
  '目标目录不存在'
} catch {
  '其它错误:' + $_.Exception.Message
}
# 批量场景:把错误收集起来不中断
try {
  Get-ChildItem D:\Data -Recurse -ErrorAction Stop | Measure-Object
} catch {
  Write-Warning ('处理中断:' + $_.Exception.Message)
}
# 查看错误分类信息
$Error[0].CategoryInfo

语句块与要点

语句块作用注意点
try放置可能出错的操作未升级错误级别时非终止错误不会触发捕获
catch处理错误,可按类型分多个不指定类型时捕获所有终止错误
finally无论成败都会执行适合释放资源与输出收尾信息
错误记录当前对象是错误记录取异常对象与分类信息用于判断
升级参数把错误升级为终止错误外部程序失败仍需按退出码判断
全局设置统一把错误行为设为终止影响范围大,需评估既有脚本
catch 块里的输出会混进正常结果流,若后续还要处理数据,调试信息应写到警告或详细流,避免污染管道输出。
把错误行为全局设为终止会改变所有命令的行为,已有脚本可能因此提前中断。优先在需要的地方按命令单独声明,把全局修改留给专门设计的脚本。

易错点

  • 以为 catch 能捕获所有错误:非终止错误不会触发捕获,必须先把错误升级为终止错误
  • 忘记判断外部程序退出码:外部程序失败不一定产生可捕获的异常,需要另外检查退出码
  • 在 catch 里使用普通输出:会混入结果流污染数据,调试信息应写到警告或详细流
  • finally 里做可能失败的操作:收尾本身出错会掩盖原始错误信息,收尾逻辑要尽量简单可靠
  • 只捕获不记录:异常被吞掉后没有任何痕迹,排障时无从下手,至少写入日志或警告

数据来源与参考

  • Microsoft Learn:about_Try_Catch_Finally

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌