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

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

最佳答案

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
    
    
    ~> 
    

    关于powershell - 尝试仅在终止异常时起作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57628340/

    相关文章:

    powershell - 属性System.Boolean IsReadOnly = False

    .net - .NET 中预定义异常的引用

    exception - Groovy on Grails的初学者问题

    C# try..catch - 将错误处理流程从一个捕获重定向到下一个捕获

    powershell - 将子进程的输出重定向到父进程 - Powershell

    powershell - 按文件中的第一列排序

    powershell - 为什么Write-Error在其上方显示所有代码?

    c++ - 如何调试未知代码中的异常?

    java - 只返回 ArrayList 中的最后一个元素

    c# - 从 try...catch 返回 null 的方法