РАЗДЕЛ
	about_Try_Catch_Finally

КРАТКОЕ ОПИСАНИЕ
	Описание использования блоков Try, Catch и Finally для обработки 
	прерывающих ошибок.


ПОЛНОЕ ОПИСАНИЕ
	Блоки Try, Catch и Finally используются для ответа или обработки 
	прерывающих ошибок в скриптах. Для обработки прерывающих ошибок в 
	скриптах можно использовать также инструкцию Trap. Дополнительные 
	сведения см. в разделе about_Trap.


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


	С помощью блока Try определяется раздел скрипта, в котором Windows 
	PowerShell следует следить за ошибками. Если в блоке Try происходит 
	ошибка, она сначала сохраняется в автоматическую переменную $Error. 
	Затем Windows PowerShell ищет блок Catch для обработки ошибки. Если у 
	инструкции Try нет соответствующего блока Catch, Windows PowerShell 
	продолжает искать подходящий блок Catch или инструкцию Trap в 
	родительских областях. По завершении блока Catch (или если не удается 
	найти подходящий блок Catch или инструкцию Trap) выполняется блок Finally. 
	Если ошибку обработать невозможно, она записывается в поток ошибок.


	Блок Catch может включать команды для отслеживания ошибок или для 
	восстановления нормального потока исполнения скрипта. Блок Catch 
	может указывать типы перехватываемых им ошибок. Инструкция Try может 
	включать несколько блоков Catch для разных типов ошибок.


	Блок Finally можно использовать для высвобождения ресурсов, 
	которые больше не нужны скрипту. 


	Try, Catch и Finally напоминают ключевые слова Try, Catch и 
	Finally, которые используются в языке программирования C#.


  Синтаксис
	Инструкция Try содержит блок Try, ноль или больше блоков Catch 
	и ноль или больше блоков Finally. Инструкция Try должна 
	содержать как минимум один блок Catch или один блок Finally.


	Ниже показан синтаксис блока Try:

		try {<список_инструкций>}


	За ключевым словом Try следует список инструкций в фигурных 
	скобках. Если во время выполнения инструкций из списка происходит 
	прерывающая ошибка, скрипт передает объект ошибки из блока Try 
	соответствующему блоку Catch. 


	Ниже показан синтаксис блока Catch: 

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


	Типы ошибок указываются в квадратных скобках. Внешние скобки 
	означают, что этот элемент необязателен.


	За ключевым словом Catch идет необязательный список 
	спецификаций типов ошибок и список инструкций. Если в блоке Try 
	происходит прерывающая ошибка, Windows PowerShell ищет 
	подходящий блок Catch. Если он найден, выполняются инструкции в 
	блоке Catch.


	Блок Catch может указывать один или несколько типов ошибок. Тип 
	ошибки - это исключение Microsoft .NET Framework или исключение, 
	наследуемое от исключения .NET Framework. Блок Catch обрабатывает ошибки 
	указанного класса исключений .NET Framework или любого класса, 
	наследуемого от указанного класса.


	Если блок Catch указывает тип ошибок, этот блок Catch 
	обрабатывает этот тип ошибок. Если блок Catch не указывает тип 
	ошибок, этот блок обрабатывает любые ошибки, возникающие в 
	блоке Try. Инструкция Try может включать несколько блоков Catch 
	для разных определенных типов ошибок. 


	Ниже показан синтаксис блока Finally:

		finally {<список_инструкций>}


	За ключевым словом Finally следует список инструкций, 
	выполняющийся при каждом запуске скрипта, даже если инструкция 
	Try была выполнена без ошибок или ошибка была перехвачена 
	инструкцией Catch. 


	Обратите внимание, что при нажатии сочетания клавиш CTRL+C конвейер 
	останавливается. Объекты, отправляемые в конвейер, не попадут в набор 
	выходных данных. Поэтому, если должно отображаться какое-нибудь 
	предложение, например "Выполнен блок Finally", после нажатия 
	сочетания клавиш CTRL+C его отображение не произойдет, даже если блок 
	Finally был выполнен.


  Перехват ошибок
	В приведенном ниже примере скрипта показан блок Try с блоком Catch:

		try { NonsenseString }
		catch { "Произошла ошибка." }


	Ключевое слово Catch должно располагаться непосредственно за 
	блоком Try или другим блоком Catch. 


	Windows PowerShell не распознает "NonsenseString" как командлет 
	или другой элемент. Выполнение скрипта возвращает такие результаты:

		Произошла ошибка.


	Когда скрипт сталкивается с "NonsenseString", он выдает прерывающую 
	ошибку. Блок Catch обрабатывает ошибку, выполняя список инструкций в 
	блоке.


  Использование нескольких инструкций Catch
	Инструкция Try может содержать любое число блоков Catch. Например, 
	следующий скрипт содержит блок Try, загружающий файл MyFile.doc. Блок Try 
	содержит два блока Catch:

		try
		{
			 $wc = new-object System.Net.WebClient 
			 $wc.DownloadFile("http://www.contoso.com/MyDoc.doc") 
	}
		catch [System.Net.WebException],[System.IO.IOException] 
		{
			"Не удается загрузить MyDoc.doc с сайта http://www.contoso.com." 
	}
		catch
		{
			"Произошла неразрешимая ошибка." 
	}


	Первый блок Catch обрабатывает ошибки типов System.Net.WebExcept
	ion и System.IO.IOException. Второй блок Catch не указывает тип 
	ошибок. Второй блок Catch обрабатывает любые другие возникающие 
	прерывающие ошибки.


	Windows PowerShell сопоставляет типы ошибок по наследованию. 
	Блок Catch обрабатывает ошибки указанного класса исключений 
	.NET Framework или любого класса, наследуемого от указанного 
	класса. В следующем примере содержится блок Catch, 
	перехватывающий ошибку "Команда не найдена".

		catch [System.Management.Automation.CommandNotFoundException] 
			{"Inherited Exception" }


	Указанный тип ошибок CommandNotFoundException наследуется от типа 
	System.SystemException. Фрагмент в следующем примере тоже 
	перехватывает ошибку "Команда не найдена":

		catch [System.SystemException] {"Base Exception" }


	Этот блок Catch обрабатывает ошибку "Команда не найдена" и 
	другие ошибки, наследуемые от типа SystemException.


	Если указывается класс ошибок и один из производных классов, 
	блок Catch для производного класса следует расположить перед 
	блоком Catch для общего класса.


  Освобождение ресурсов с помощью Finally
	Чтобы высвободить ресурсы, используемые скриптом, добавьте 
	после блоков Try и Catch блок Finally. Инструкции блока Finally 
	выполняются независимо от того, происходит ли в блоке Try прерывающая 
	ошибка. Windows PowerShell выполняет блок Finally перед завершением 
	скрипта или перед тем, как текущий блок выйдет из области действия. 


	Блок Finally выполняется даже при нажатии сочетания клавиш 
	CTRL+C для прекращения скрипта. Блок Finally выполняется, и 
	если ключевое слово Exit останавливает скрипт из блока Catch.


СМ. ТАКЖЕ
	about_Errors
	about_Trap