【问题标题】:Do try's only work with terminating exceptions?尝试仅适用于终止异常吗?
【发布时间】:2019-12-28 21:35:42
【问题描述】:

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

【问题讨论】:

  • 试试try { 1/0;'hi' } catch { 'term' }。你的$ErrorActionPreference是什么?
  • 我看不到您的示例中失败的地方,并且无法复制。
  • @TheIncorrigible1 我认为如果 1/0 终止,'hi' 将永远不会打印。
  • 考虑一个语句(例如你运行的任何命令)有它自己的内部代码。显然 0/1 是一个非常简单的例子,但Get-ChildItem 会做很多事情。如果Get-ChildItem 返回了一个非终止错误,则说明出了问题,但它会继续它必须做的任何其他事情。如果它有一个导致语句终止错误的问题,那么Get-ChildItem 将停止它的工作,但允许脚本继续(例如,任何进一步的命令将运行)。如果Get-ChildItem 出现导致脚本终止错误的问题,则脚本将在该错误后停止。

标签: powershell exception try-catch


【解决方案1】:

TheIncorrigible1 提供的GitHub issue 为您提供了您正在寻找的答案。

在 PowerShell 中似乎有两种类型的终止错误:

  • 语句终止错误
  • 脚本终止错误

还有非终止错误。

我的理解是,发生非终止错误时,当前语句输出错误但继续执行。当语句终止错误发生时,将输出错误并且该语句终止,但脚本随后继续执行任何进一步的语句。当发生脚本终止错误时,脚本会在该错误处停止。

1/0 是语句终止错误,因此它会在try..catch 中触发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


~> 

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2023-03-22
    • 1970-01-01
    • 2016-01-26
    • 2013-06-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多