Как вы обнаружили, вы можете обойти необходимость вашей попытки обработки исключений с помощью командлета Test-Path
, чтобы определить, существует ли данный путь - и если существование - это все, о чем вы заботитесь, этого достаточно:
В общем случае , однако, даже если путь существует , вы все равно можете столкнуться с ошибками при traversal .
Для решения вашей первоначальной попытки: есть две фундаментальные проблемы:
Как Мэтт указывает в комментарии, Get-ChildItem
, не найдя заданный путь, приводит к не прекращающейся ошибке, тогда как try
/ catch
относится только к завершению ошибок .
Однако вы можете повысить нескончаемых ошибок до завершающих, добавив в команду общий параметр -ErrorAction Stop
.
Сводка типов ошибок PowerShell и их обработки приведена в этом сообщении GitHub .
Чтобы квалифицировать условные catch
обработчики, вы должны использовать литералы типа исключения , например, [System.Management.Automation.ItemNotFoundException]
, не значение свойство .FullyQualifiedErrorId
записи об ошибке (например, PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
)
- Чтобы определить полное имя типа исключения записи об ошибке, выполните следующую команду после возникновения ошибки:
$Error[0].Exception.GetType().FullName
Вот исправленная версия вашего кода, основанная на вышеупомянутом:
try {
Get-ChildItem $FPF -ErrorAction Stop
} catch [System.Management.Automation.ItemNotFoundException] { # input path not found
Write-Error "Not found: $FPF"
} catch { # any other error
Throw "An unexpected error occurred: $_"
}