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