Powershell陷阱[Exception]没有捕获我的错误

时间:2011-08-26 02:11:47

标签: powershell exception exception-handling powershell-trap

由于某些原因,当我针对不存在的文件运行以下脚本时,我的脚本没有捕获异常。我根据我在网络上找到的示例来编写此代码,但它似乎对我不起作用。

我很感激有关如何解决此问题的任何提示或指示。

注意:在下面的例子中我也试过

trap [Exception] {

但这也不起作用。

这是脚本:

function CheckFile($f) {

      trap {
        write-host "file not found, skipping".
        continue
      }

      $modtime = (Get-ItemProperty $f).LastWriteTime

      write-host "if file not found then shouldn't see this"
}


write-host "checking a file that does not exist"
CheckFile("C:\NotAFile")
write-host "done."

输出:

PS > .\testexception.ps1
checking a file that does not exist
Get-ItemProperty : Cannot find path 'C:\NotAFile' because it does not exist.
At C:\Users\dleclair\Documents\Visual Studio 2010\lib\testexception.ps1:12 char:35
+       $modtime = (Get-ItemProperty <<<<  $f).LastWriteTime
    + CategoryInfo          : ObjectNotFound: (C:\NotAFile:String) [Get-ItemProperty], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemPropertyCommand

if file not found then shouldn't see this
done.
PS >

2 个答案:

答案 0 :(得分:6)

试试这样:

trap { write-host "file not found, skipping";continue;}
$modtime = Get-ItemProperty c:\manoj -erroraction stop

基于OP的评论:

我认为你误解了你所链接的文章中的内容:

  

在这个例子中,我们使用继续导致执行返回到   陷阱所在的范围并执行下一个命令。这很重要   请注意,执行只返回陷阱的范围,所以如果   异常被抛入函数内部,甚至在if语句中抛出,   并被困在它之外...继续将在结束时恢复   嵌套范围。

所以如果你做这样的事情:

trap{ write-host $_; continue;}
throw "blah"
write-host after

after将被打印。

但如果你做这样的事情:

trap{ write-host $_ ; continue}
function fun($f) {


      throw "blah"
      write-host after
}

fun
write-host "outside after"

after将不会被打印,但outside after将会打印。

或者,使用try-catch块:

      try{
      $modtime = (Get-ItemProperty $f -erroraction stop).LastWriteTime
      write-host "if file not found then shouldn't see this"
      }
      catch{
        write-host "file not found, skipping".
      }

答案 1 :(得分:0)

您必须在函数内部或外部({全局应用程序中)将$ErrorActionPreference设置为SilentlyContinue才能使trap生效。或者(如上所述),将-ErrorAction公共参数设置为相同的内容。