Powershell trap [Exception] не ловит мою ошибку



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



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

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



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:UsersdleclairDocumentsVisual Studio 2010libtestexception.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 >
592   2  

2 ответов:

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.