РАЗДЕЛ
	about_Trap

КРАТКОЕ ОПИСАНИЕ
	Описывает ключевое слово, обрабатывающее прерывающие ошибки.


ПОЛНОЕ ОПИСАНИЕ
	Прерывающая ошибка останавливает выполнение инструкции. Если 
	Windows PowerShell не обрабатывает каким-либо образом прерывающую 
	ошибку, Windows PowerShell прерывает и функцию или скрипт в 
	текущем конвейере. В других языках, например C#, прерывающие 
	ошибки называются исключениями.


	Ключевое слово Trap определяет список инструкций, которые нужно 
	выполнить при возникновении прерывающей ошибки. Инструкции Trap 
	обрабатывают прерывающие ошибки и обеспечивают продолжение 
	выполнения скрипта или функции.


  Синтаксис

	Синтаксис инструкции Trap следующий:

		trap [[<тип_ошибки>]] {<список_инструкций>}


	Инструкция Trap включает список инструкций, которые нужно 
	выполнить при возникновении прерывающей ошибки. Ключевое слово 
	Trap может, кроме того, задавать тип ошибки. Тип ошибки 
	указывается в квадратных скобках. 


	Скрипт или команда могут содержать несколько инструкций Trap. 
	Инструкции Trap можно помещать в любое место скрипта или команды. 


  Перехват всех прерывающих ошибок

	При возникновении прерывающей ошибки, которая не обрабатывается 
	скриптом или командой, Windows PowerShell проверяет, нет ли 
	инструкции Trap для обработки этой ошибки. Если инструкция Trap 
	есть, Windows PowerShell продолжает выполнять скрипт или 
	команду в инструкции Trap.
 

	Ниже показан пример простейшей инструкции Trap:

		trap {"Обнаружена ошибка."}


	Эта инструкция Trap перехватывает все прерывающие ошибки. Ниже 
	показан пример функции, содержащей эту инструкцию Trap:

		function TrapTest {
			trap {"Обнаружена ошибка."}
			nonsenseString
		}


	Эта функция включает бессмысленную строку, вызывающую ошибку. 
	При выполнении эта функция возвращает следующие результаты:

		C:\PS> TrapTest
		Обнаружена ошибка.


	Ниже показан пример инструкции Trap, выводящей ошибку с помощью 
	автоматической переменной $_:

		function TrapTest {
			trap {"Обнаружена ошибка: $_"}
			nonsenseString
		}


	При выполнении эта версия функции возвращает следующие результаты:

		C:\PS> TrapTest
		Обнаружена ошибка: условие "nonsenseString" не распознано 
		как имя командлета, функции, файла скрипта или выполняемой 
		программы. Проверьте правильность написания имени, наличие 
		и правильность пути и повторите попытку. 


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


   Перехват определенных прерывающих ошибок

	Ниже показан пример инструкции Trap, перехватывающей ошибки типа 
	CommandNotFoundException:

		trap [System.Management.Automation.CommandNotFoundException]
			{"Перехвачена ошибка команды"}


	Когда функция или скрипт обнаруживает строку, не совпадающую с 
	какой-нибудь известной командой, эта инструкция Trap отображает 
	строку "Перехвачена ошибка команды". После выполнения 
	инструкций списка Trap Windows PowerShell записывает объект 
	ошибки в поток ошибок и продолжает выполнять скрипт.


	Windows PowerShell использует типы исключений Microsoft .NET 
	Framework 3.0. В показанном ниже примере задается тип ошибок 
	System.Exception:

		trap [System.Exception] {"Перехвачена ошибка"}


	Тип ошибок CommandNotFoundException наследуется от типа 
	System.Exception. Эта инструкция перехватывает ошибку, которую 
	создает неизвестная команда. Она, кроме того, перехватывает 
	другие типы ошибок.


	В скрипте может быть несколько инструкций Trap. Одна ошибка 
	может быть перехвачена только одной инструкцией Trap. Если 
	происходит ошибка и при этом доступно несколько инструкций 
	Trap, Windows PowerShell использует ту инструкцию Trap, тип 
	ошибок которой лучше всего соответствует ошибке. 


	В следующем примере скрипта содержится ошибка. Скрипт включает 
	общую инструкцию Trap, перехватывающую любые прерывающие 
	ошибки, и определенную инструкцию Trap, для которой задан тип 
	CommandNotFoundException.

		trap {"Перехвачена другая прерывающая ошибка" } trap 
		[System.Management.Automation.CommandNotFoundException] {"Перехвачена 
		ошибка команды"} nonsenseString


	Выполнение скрипта приводит к таким результатам:

		Перехвачена ошибка команды
		Условие "nonsenseString" не распознано как имя командлета, 
		функции, файла скрипта или выполняемой программы. Проверьте 
		правильность написания имени, наличие и правильность пути и 
		повторите попытку.
		В C:\PS>testScript1.ps1:3 знак:19
		+   nonsenseString <<<< 


	Так как Windows PowerShell не распознает "nonsenseString" как 
	командлет или другой элемент, возвращается ошибка 
	CommandNotFoundException. Эта прерывающая ошибка перехватывается
	определенной инструкцией Trap.


	Ниже показан пример скрипта с теми же инструкциями Trap, но с 
	другой ошибкой:

		trap {"Перехвачена другая прерывающая ошибка" } 
		trap [System.Management.Automation.CommandNotFoundException] 
			{"Перехвачена ошибка команды"}
		1/$null


	Выполнение скрипта приводит к таким результатам:

		перехвачена другая прерывающая ошибка;
		попытка деления на ноль.
		В C:PS> errorX.ps1:3 знак:7
		+   1/ <<<< $null


	Попытка поделить на ноль не создает ошибку CommandNotFoundExcept
	ion. Эта ошибка перехватывается другой инструкцией Trap, 
	предназначенной для любых прерывающих ошибок. 


  Перехват ошибок и область

	Если прерывающая ошибка происходит в той же области, где 
	находится инструкция Trap, Windows PowerShell после выполнения 
	инструкций Trap продолжает с инструкции после ошибки. Если 
	ошибка и инструкция Trap находятся в разных областях, 
	выполнение продолжается со следующей инструкции из области, в 
	которой находится инструкция Trap.
 

	Например, если ошибка происходит в функции, а инструкция Trap 
	находится в этой функции, скрипт продолжается со следующей 
	инструкции. Например, следующий скрипт содержит ошибку и 
	инструкцию Trap:

		function function1 {
			trap { "Ошибка: " }
			NonsenseString
			"function1 выполнена"
		}


	Выполнение функции Function1 в следующей части скрипта приводит 
	к таким результатам: 

		function1
		Ошибка: 
		Условие "NonsenseString" не распознано как имя командлета, 
		функции, файла скрипта или выполняемой программы. Проверьте 
		правильность написания имени, наличие и правильность пути и 
		повторите попытку.
		В C:\PS>TestScript1.ps1:3 знак:19
		+   NonsenseString <<<<

		function1 выполнена 
 

	Инструкция Trap в функции перехватывает ошибку. После вывода 
	сообщения Windows PowerShell продолжает выполнять функцию. 
	Обратите внимание, что функция Function1 была выполнена.


	Сравните это со следующим примером, в котором содержатся те же 
	ошибка и инструкция Trap. В этом примере инструкция Trap 
	выполняется вне функции:

		function function2 {
			NonsenseString
			"function2 выполнена"
		}

		trap { "Ошибка: " }
			. . .
		function2


	Выполнение функции Function2 в следующей части скрипта приводит 
	к таким результатам:

		Ошибка: 
		Условие "NonsenseString" не распознано как имя командлета, 
		функции, файла скрипта или выполняемой программы. Проверьте 
		правильность написания имени, наличие и правильность пути и 
		повторите попытку.
		В C:\PS>TestScript2.ps1:4 знак:19
		+   NonsenseString <<<<


	В этом примере не была выполнена команда "function2 завершена". 
	Несмотря на то что обе прерывающие ошибки произошли внутри 
	функции, Windows PowerShell не возвращается обратно в функцию 
	после выполнения инструкции Trap, потому что инструкция 
	находилась вне функции.


  Использование ключевых слов Break и Continue

	Ключевые слова Break и Continue можно использовать в инструкции 
	Trap, чтобы определить, будет ли скрипт или команда продолжать 
	выполняться после прерывающей ошибки. 


	Если в список инструкций Trap включена инструкция Break, 
	Windows PowerShell прерывает функцию или скрипт. Следующий 
	пример функции использует ключевое слово Break в инструкции Trap:

		C:\PS> function break_example {
			trap {"Перехвачена ошибка"; break;}
			1/$null
			"Функция выполнена."
		}

		C:\PS> break_example
		Перехвачена ошибка
		Попытка деления на ноль.
		В строке:4 знак:7


	Инструкция Trap включала ключевое слово Break, поэтому функция 
	перестала выполняться и строка "Функция выполнена" запущена не была.


	Если в инструкцию Trap включена инструкция Continue, Windows 
	PowerShell продолжает после утверждения, вызвавшего ошибку, как 
	если бы ключевых слов Break или Continue не было. Но с ключевым 
	словом Continue Windows PowerShell не записывает ошибку в поток 
	ошибок. 


	Следующий пример функции использует ключевое слово Continue в 
	инструкции Trap:

		C:\PS> function continue_example {
			trap {"Перехвачена ошибка"; continue;} 
			1/$null
			"Функция выполнена."}

		C:\PS> continue_example
		Перехвачена ошибка
		Функция выполнена. 


	Функция продолжает выполнение после перехвата ошибки, и 
	запускается инструкция "Функция выполнена". Ошибка не 
	записывается в поток. 


СМ. ТАКЖЕ
	about_Break
	about_Continue
	about_Throw
	about_Try_Catch_Finally
	about_Scopes