В этой большой статье Кейт объясняет разницу между завершающими и не заканчивающимися ошибками в Powershell. В соответствии с исключениями Кита, вызванными из вызовов участнику .NET-объекта или типа, это недопустимые ошибки.
Действительно, если мы определим этот класс .net для тестирования:
$a = Add-Type 'public class bla { public static void bl() { throw new System.ApplicationException("test"); }}' -PassThru
И затем эта функция:
function tst { 1 | write-host; $a::bl(); 2 | Write-host }
мы увидим, что при вызове функции tst исключение оказывается не завершающим: второй Write-Host
работает.
Но рассмотрим следующее:
function tst2 { try { tst } catch { "Catch!" } }
Если мы откроем документацию, мы можем прочитать, что catch отвечает или обрабатывает завершающие ошибки в скриптах. Во всем тексте статей ошибки, которые статья имеет дело с квалифицированным "прекращением" во многих местах.
Итак, когда мы запускаем строку над вторым Write-Host, она не запускается, но блок catch делает это. Похоже, что наша неокончательная ошибка внезапно прекращается.
Как получилось?
Другое наблюдение заключается в том, что с хорошей старой ловушкой все еще не заканчивается ошибка:
function tst3 { tst trap { "Trap!" } }
Теперь, с практической точки зрения, я хочу достичь следующего. В блоке кода я хочу прекратить исключения из кода .NET. Я хочу оставить завершающие ошибки из завершающих и не завершающих ошибок командлетов из командлетов, не заканчивающихся.
Как мне это достичь?
Пример:
Do-Something
Call::Something()
Do-SomethingElse
Call::SomethingElse()
Do-YetMoreSomething
Call::YetMoreSomething()
Я хочу завершить все исключения из вызовов .net выше. Я также хочу прекратить прерывание ошибок командлетов. Я не хочу останавливать на ошибках, отличных от завершающих командлетов.