Ловушка Powershell [Exception] не улавливает мою ошибку - PullRequest
7 голосов
/ 26 августа 2011

По какой-то причине мой сценарий не перехватывает исключение, когда я запускаю следующий сценарий для файла, который не существует.Этот код основан на примерах, которые я нашел в Интернете, но, похоже, он не работает для меня.

Буду признателен за любые советы или указания, как это исправить.

Примечание: вВ приведенном ниже примере я также попробовал

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."

output:

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 ]

6 голосов
/ 26 августа 2011

Попробуй так:

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

На основании комментариев от OP:

Я думаю, ты неправильно понял то, что говорится в статье, на которую ты ссылался:

В этом примере мы использовали продолжает, чтобы заставить выполнение вернуться в область, в которой находится ловушка, и выполнить следующую команду.Важно отметить, что выполнение возвращается только в область действия ловушки, поэтому, если исключение было сгенерировано внутри функции или даже внутри оператора if и захвачено за ее пределами ... continue получит в конце вложенной области действия.

Итак, если вы сделаете что-то вроде этого: будет напечатано

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".
      }
0 голосов
/ 29 августа 2011

Вы должны установить $ErrorActionPreference в SilentlyContinue внутри функции или вне скрипта (для глобального приложения), чтобы trap работал.В качестве альтернативы (как упомянуто выше), установите -ErrorAction общий параметр на то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...