尝试仅在终止异常时起作用吗?

时间:2019-08-23 14:32:29

标签: powershell exception try-catch

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以“考虑声明...”开头的注释,以了解“语句终止”异常是什么。基本上,一个命令中的代码不会完成,但脚本的其余部分会完成。

1 个答案:

答案 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


~>