Try / Catch仅适用于终止异常,对吗?这表明1/0是终止错误。
try { 1/0 } catch { 'term' }
term
但是,如果我在脚本中运行以下代码,该脚本将继续运行,因此1/0是否真的终止了?我认为如果1/0终止,则“ hi”将永远不会显示:
1/0
'hi'
返回:
Attempted to divide by zero.
At C:\users\admin\test.ps1:1 char:1
+ 1/0
+ ~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
hi
编辑:
请参阅Mark Wragg以“考虑声明...”开头的注释,以了解“语句终止”异常是什么。基本上,一个命令中的代码不会完成,但脚本的其余部分会完成。
答案 0 :(得分:3)
GitHub issue提供的TheIncorrigible1为您提供了所需的答案。
在PowerShell中似乎有两种终止错误:
还有非终止错误。
我的理解是,当发生非终止错误时,当前语句输出错误,但会继续执行。当发生语句终止错误时,将输出错误并终止该语句,但是脚本随后将继续执行任何其他语句。当脚本终止错误发生时,脚本将在该错误处停止。
1/0
是一个语句终止错误,因此它会在catch
中触发try
。.catch
(不会出现非终止错误),但是会触发不停止脚本执行。
Throw
创建脚本终止错误。
如果您设置了$ErrorActionPreference = Stop
,则语句终止错误将变成脚本终止错误。
示例:
$ErrorActionPreference = 'Stop'
1/0
'hi'
结果:
1/0
'hi'
Attempted to divide by zero.
At line:4 char:1
+ 1/0
+ ~~~
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : RuntimeException
~>