none
Перехват исключения Powershell RRS feed

  • Вопрос

  • try
    {
    	get-WmiObject -class Win32_Share -computer "filesrv99"
    	
    	$Error.Exception
    }
    # Catch specific types of exceptions thrown by one of those commands
    catch [System.Exception] {
    	$Error.Exception
    }
    # Catch all other exceptions thrown by one of those commands
    catch
    {
    	$Error.Exception
    }
    

    Сервера filesrv99 не существует, при проверке на список шар появляется исключение.   Но в блок catch не проваливается.

    Кто может пояснить причину? 

    • Перемещено Alexander RusinovModerator 1 октября 2016 г. 9:47 Более подходящий раздел форума
    1 октября 2016 г. 9:37

Ответы

  • У вас ErrorAction находится в дефолтном состоянии "Continue" таким образом вы видите ошибку но не обрабатываете ее

    Для того что бы провалиться в Catch нужно изменить значение ErrorAction одним из следующих методов:

    # В начало скрипта изменит дефолтное поведения для всего скрипта который находится ниже,
    # или до тех пор пока не измение значение на другое

    $ErrorActionPreference = 'stop'

    или 

    try { get-WmiObject -class Win32_Share -computer "filesrv99" -ErrorAction 'Stop' 'Catch does`'nt work' } # Catch specific types of exceptions thrown by one of those commands catch {

    'Catch work fine' $Error[0].Exception }

    Нужно так же помнить что $Error хранит в себе не одну ошибку, а все ошибки в пределах сессии (это массив), а вам нужна последняя, ее можно вызвать $Error[0]


    The opinion expressed by me is not an official position of Microsoft



    • Изменено Vector BCOModerator 1 октября 2016 г. 10:08
    • Помечено в качестве ответа Daniil Sedov 1 октября 2016 г. 18:23
    1 октября 2016 г. 10:00
    Модератор
  • В PowerShell есть два типа ошибок terminating и non-terminating errors. Командлет get-WmiObject  возвращает non-terminating error и не попадает в блок try-catch, т.к. он работает только с terminating  error(как в случае с  Get-ADUser). Как сделать, чтобы get-WmiObject возвратил terminating  error, уже подсказал Vector BCO , добавлением к get-WmiObject  -ErrorAction 'Stop'.

    Переменная $Error - хранит все ошибки, поэтому лучше использовать переменную $_.

    try
    {
    	get-WmiObject -class Win32_Share -computer "filesrv99" -Ea Stop
    }
    
    catch
    {
    	$_.Exception
    }

    Подробнее:

    https://blogs.technet.microsoft.com/heyscriptingguy/2015/09/15/error-handling-two-types-of-errors/

    https://blogs.technet.microsoft.com/heyscriptingguy/2015/09/16/understanding-non-terminating-errors-in-powershell/

    http://www.vexasoft.com/blogs/powershell/7255220-powershell-tutorial-try-catch-finally-and-error-handling-in-powershell

    https://www.gitbook.com/book/devopscollective/the-big-book-of-powershell-error-handling/details



    • Изменено KazunEditor 1 октября 2016 г. 14:38
    • Помечено в качестве ответа Daniil Sedov 1 октября 2016 г. 18:23
    1 октября 2016 г. 14:33
    Отвечающий

Все ответы

  • У вас ErrorAction находится в дефолтном состоянии "Continue" таким образом вы видите ошибку но не обрабатываете ее

    Для того что бы провалиться в Catch нужно изменить значение ErrorAction одним из следующих методов:

    # В начало скрипта изменит дефолтное поведения для всего скрипта который находится ниже,
    # или до тех пор пока не измение значение на другое

    $ErrorActionPreference = 'stop'

    или 

    try { get-WmiObject -class Win32_Share -computer "filesrv99" -ErrorAction 'Stop' 'Catch does`'nt work' } # Catch specific types of exceptions thrown by one of those commands catch {

    'Catch work fine' $Error[0].Exception }

    Нужно так же помнить что $Error хранит в себе не одну ошибку, а все ошибки в пределах сессии (это массив), а вам нужна последняя, ее можно вызвать $Error[0]


    The opinion expressed by me is not an official position of Microsoft



    • Изменено Vector BCOModerator 1 октября 2016 г. 10:08
    • Помечено в качестве ответа Daniil Sedov 1 октября 2016 г. 18:23
    1 октября 2016 г. 10:00
    Модератор
  • try
    {
    	Get-Aduser ghmgh
    	
    	$Error.Exception
    }
    # Catch specific types of exceptions thrown by one of those commands
    catch [System.Exception] {
    	$Error.Exception
    }
    # Catch all other exceptions thrown by one of those commands
    catch
    {
    	$Error.Exception
    }
    Почему же тогда в этом случае провалится в catch?   Значит по умолчанию ErrorAction 'Stop' для командлета? Следующий вытекший вопрос  как узнать статус  ErrorAction для определенного командлета? это возможно?
    1 октября 2016 г. 12:34
  • как вы видите что отрабатывает Catch или нет?
    Я Вам привел пример в котором видно отрабатывает Catch или нет. Используйте нечто такого плана. По умолчанию ErrorAction -eq Continue, и если вы его не изменили на уровне скрипта или командлета то он таким и остается

    The opinion expressed by me is not an official position of Microsoft

    1 октября 2016 г. 13:15
    Модератор
  • Я ставлю брейккпоинты и вижу что в первом случае Catch не отрабатывает во втором отрабатывает, при условии что я не выставляю ErrorAction не на уровне скрипта, не на уровне командлета в обоих случаях.

    Ваш пример я понял, он понятен.    Но тогда как обяснить второй случай?) попробуйте в AD найти не существующего пользователя.

    1 октября 2016 г. 13:46
  • В PowerShell есть два типа ошибок terminating и non-terminating errors. Командлет get-WmiObject  возвращает non-terminating error и не попадает в блок try-catch, т.к. он работает только с terminating  error(как в случае с  Get-ADUser). Как сделать, чтобы get-WmiObject возвратил terminating  error, уже подсказал Vector BCO , добавлением к get-WmiObject  -ErrorAction 'Stop'.

    Переменная $Error - хранит все ошибки, поэтому лучше использовать переменную $_.

    try
    {
    	get-WmiObject -class Win32_Share -computer "filesrv99" -Ea Stop
    }
    
    catch
    {
    	$_.Exception
    }

    Подробнее:

    https://blogs.technet.microsoft.com/heyscriptingguy/2015/09/15/error-handling-two-types-of-errors/

    https://blogs.technet.microsoft.com/heyscriptingguy/2015/09/16/understanding-non-terminating-errors-in-powershell/

    http://www.vexasoft.com/blogs/powershell/7255220-powershell-tutorial-try-catch-finally-and-error-handling-in-powershell

    https://www.gitbook.com/book/devopscollective/the-big-book-of-powershell-error-handling/details



    • Изменено KazunEditor 1 октября 2016 г. 14:38
    • Помечено в качестве ответа Daniil Sedov 1 октября 2016 г. 18:23
    1 октября 2016 г. 14:33
    Отвечающий