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 块里的输出会混进正常结果流,若后续还要处理数据,调试信息应写到警告或详细流,避免污染管道输出。
把错误行为全局设为终止会改变所有命令的行为,已有脚本可能因此提前中断。优先在需要的地方按命令单独声明,把全局修改留给专门设计的脚本。