你如何让Powershell抛出函数内部产生的异常?

时间:2017-04-06 03:37:28

标签: powershell

我正在尝试写一些类似的东西:

function Do-Something () {
  Write-Host "Starting something"
  Do-SomethingWhichThrowsAnException
  Write-Host "Something completed successfully"
}

...

function Process-Thing () {
  try {
    Do-OneThing
    Do-TwoThing
    Do-Something
    Do-SomethingElse
  }
  catch {
    Write-Host "Exception Caught!"
  }
}

我得到以下输出:

Starting something
{massive red exception text}
Something completed successfully

为什么我看不到"异常被捕?"?

为什么我会看到"某些事情已成功完成"?

Powershell只是在堆栈中抛出异常还是什么?

如果是这样,是否有可能将其提交?我是否必须尝试/捕获我的Do-XXXthing函数中的每一个?

1 个答案:

答案 0 :(得分:1)

检查article

  

因此,如果我想捕获所有发生的错误,我将捕获[System.Exception],因为这是所有错误的根源。这是我使用的Catch块:

     

Catch [System.Exception] {"抓住异常"}

     

接下来要认识到的是,如果我尝试了某些东西,并且它不会产生终止错误,那么无论如何它都不会进入Catch块。这是因为$ ErrorActionPreference的默认值(Windows PowerShell在出现错误时将执行的操作)是继续执行下一个命令。

     

实际上,这意味着如果发生错误并且Windows PowerShell可以从中恢复,它将尝试执行下一个命令。但它会通过向控制台显示错误让您知道发生的错误。

     

如果我想看看Windows PowerShell在出现非终止错误时会做什么,我会查看$ ErrorActionPreference变量的值,例如:

     

PS C:> $ ErrorActionPreference

     

继续

     

...

所以,我认为您应该将$ErrorActionPreference的值更改为Stop。检查此link的答案,了解如何在脚本中执行此操作。