2015-04-26 4 views
4

Мы все выросли слухами о двух типах ошибок, которые имеет PowerShell: оканчивающиеся и не заканчивающиеся ошибки.Неясный третий тип ошибки

Что описывает ошибка, не связанная с завершением, так это то, что она просто выводит поток ошибок и позволяет сценарию продолжить выполнение. Однако он не может быть пойман попыткой/уловкой, так как никакое исключение на самом деле не «бросается».

Что касается конечной ошибки, то он выводит ошибку в поток ошибок и, если необработанный, полностью останавливает скрипт на своих дорожках, предотвращая что-либо ниже строки, в которой произошла ошибка при выполнении. Его можно поймать try/catch.

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

Это ошибка, которая представляет собой смесь между завершающей и безостановочной ошибкой ... При сгенерировании она не прерывает сценарий, предоставляя ему свойства ошибки, не связанные с завершением, но она может быть пойманным try/catch, что дает ему свойства завершающей ошибки!

И это самый простой тип ошибки, которая может быть. Это исключения, созданные непосредственно самими .NET, а не функциями или командлетами PowerShell.

Пара примеров:

  • Деление на 0.
  • Вызов метода объекта с неправильными аргументами - будь то неправильные типы параметров (что PowerShell не может автоматически принуждать), неверное число аргументов, и т. д. - пример: 'a'.Split([object[]])

Вопрос в том, что они называются и почему они отличаются от двух других типов? Объект по-прежнему является ErrorRecord, а не Exception, поэтому они должны действительно вести себя как завершающие или не заканчивающиеся ошибки, а не мутация обоих.

+5

Воспитанная с Powershell? Нет, если вам всего десять лет :-) – paxdiablo

+0

Это метафора для того, чтобы говорить все блоги и документацию как от MS, так и в противном случае вы обнаружите там только оконечные и неисчерпающие ошибки. – JohnUbuntu

+1

Но почему я не могу быть 10? Возможно, мои детские рифмы были миланскими мирами и пузырями. Вы пробовали петь пузырь? Тяжелая работа! – JohnUbuntu

ответ

1

Microsoft не имеет специального имени для «it», они просто называют это завершающей ошибкой, даже если вам нужно установить $ErrorActionPreference = "Stop", чтобы заставить их вести себя одинаково с завершающей ошибкой (остановить скрипт).

Because Windows PowerShell does not recognize "nonsenseString" as a cmdlet or other item, it returns a CommandNotFoundException error. This terminating error is trapped by the specific Trap statement.

The following script example contains the same Trap statements with a different error:

trap {"Other terminating error trapped" } 
    trap [System.Management.Automation.CommandNotFoundException] 
     {"Command error trapped"} 
    1/$null 

Running this script produces the following result:

Other terminating error trapped 
    Attempted to divide by zero. 
    At C:PS> errorX.ps1:3 char:7 
    +  1/ <<<< $null 

The attempt to divide by zero does not create a CommandNotFoundException error. Instead, that error is trapped by the other Trap statement, which traps any terminating error.

Источник: about_Trap @ technet.microsoft.com

Смежные вопросы