108 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			108 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | |||
|  | title: Try Catch Finally | |||
|  | localeTitle: Попробуйте Catch Наконец | |||
|  | --- | |||
|  | # Попробуйте Catch Наконец
 | |||
|  | 
 | |||
|  | Блок Try-Catch-finally используется, чтобы избежать необработанных исключений, нарушающих ваше приложение. Когда ваш код `throws` исключение, которое находится между секцией `try` оно будет зажато в `catch` части инструкции, где вы можете обрабатывать ее по своему усмотрению. Оператор `finally` всегда запускается в конце и обычно используется для очистки неуправляемых ресурсов. Вам не всегда нужно иметь три блока, ниже приведены допустимые параметры. | |||
|  | 
 | |||
|  | *   Try-Catch-Наконец | |||
|  | *   Попробуй поймать | |||
|  | *   Примерка Наконец | |||
|  | 
 | |||
|  | ## Синтаксис
 | |||
|  | 
 | |||
|  | ```csharp | |||
|  | try  | |||
|  |  {  | |||
|  |    // Code which could potentially throw an exception  | |||
|  |    var parsedValue = Int32.Parse("abcde");  | |||
|  |  }  | |||
|  |  catch(Exception e)  | |||
|  |  {  | |||
|  |     // Code to handle the exception  | |||
|  |     Console.WriteLine("Exception: " + e.Message);  | |||
|  |  }  | |||
|  |  finally  | |||
|  |  {  | |||
|  |     // Code which will always run no matter what.  | |||
|  |     Console.WriteLine("Try-Catch block has finished execution");  | |||
|  |  }  | |||
|  | ``` | |||
|  | 
 | |||
|  | В приведенном выше примере мы пытаемся преобразовать 'abcde' в числовое значение. Эта строка генерирует исключение, потому что оно не может быть успешно преобразовано в число. Вызов будет пойман в блоке catch, и сообщение об исключении и другие данные будут сохранены в переменной, назначенной в блоке catch (буква «e» в приведенном выше примере). После того, как все это будет выполнено, раздел «finally» будет выполнен, чтобы закончить его. | |||
|  | 
 | |||
|  | ## Попробуйте блок
 | |||
|  | 
 | |||
|  | Блок try должен быть помещен вокруг кода, который может вести себя обычным образом и вызывать `Exception` и разорвать ваше приложение. Имея блок try, вы защищаете себя от фатального сбоя приложения. Важно отметить, как только ваше приложение имеет ошибку и генерируется исключение, остальная часть кода в блоке `Try` **не** будет выполнена. | |||
|  | 
 | |||
|  | Блок try имеет свою собственную область методов, поэтому любые переменные, объявленные внутри блока try, не будут доступны вне блока try. | |||
|  | 
 | |||
|  | ```csharp | |||
|  | try  | |||
|  |  {  | |||
|  |     // Read user input from the console.  | |||
|  |     var userInput = Console.ReadLine();  | |||
|  |  }  | |||
|  |  catch(Exception e)  | |||
|  |  {  | |||
|  |     Console.WriteLine("Exception: " + e.Message);  | |||
|  |  }  | |||
|  |   | |||
|  |  //Outside the Try block  | |||
|  |  var parsedUserInput = Int32.Parse(userInput);  // Not correct  | |||
|  | ``` | |||
|  | 
 | |||
|  | Приведенное выше даст вам ошибку времени компиляции, так как значение userInput недоступно. Если вам нужен доступ к переменной вне блока try-catch, вам нужно будет объявить переменную перед блоком try. | |||
|  | 
 | |||
|  | ```csharp | |||
|  | var userInput = "";  | |||
|  |  try  | |||
|  |  {  | |||
|  |     // Read user input from the console.  | |||
|  |     userInput = Console.ReadLine();  | |||
|  |  }  | |||
|  |  catch(Exception e)  | |||
|  |  {  | |||
|  |     Console.WriteLine("Exception: " + e.Message);  | |||
|  |  }  | |||
|  |   | |||
|  |  //Outside the Try block  | |||
|  |  var parsedUserInput = Int32.Parse(userInput);  // Correct  | |||
|  | ``` | |||
|  | 
 | |||
|  | ## Блок уловов
 | |||
|  | 
 | |||
|  | В этом блоке указывается, какой тип `Exception` вы хотите поймать. Если вы хотите уловить ВСЕ возможные исключения, вы можете использовать базовый класс `Exception` . Если вы хотите только поймать определенный тип исключения, вы можете указать это вместо этого. Некоторыми примерами других типов исключений являются `ArgumentException` , `OutOfMemoryException` и `FormatException` . | |||
|  | 
 | |||
|  | ```csharp | |||
|  | try  | |||
|  |  {  | |||
|  |    var parsedValue = Int32.Parse("abcde");  | |||
|  |  }  | |||
|  |  // Only FormatExceptions will be caught in this catch block.  | |||
|  |  catch(FormatException exceptionVariable)  | |||
|  |  {  | |||
|  |     Console.WriteLine(exceptionVariable.Message);  | |||
|  |  }  | |||
|  | ``` | |||
|  | 
 | |||
|  | Переменная, объявленная после типа исключения, будет содержать все данные исключения и может использоваться в блоке `Catch` . | |||
|  | 
 | |||
|  | ## Наконец, блок
 | |||
|  | 
 | |||
|  | Блок finally **всегда** запускается в конце после блоков `Try` и `Catch` . Этот раздел обычно используется, когда что-то **должно** происходить в конце, независимо от того, было ли исключено исключение. Например, скажем, нам нужна переменная, которая всегда должна быть повторно инициализирована обратно до определенного числа после того, как она будет манипулировать все время. | |||
|  | 
 | |||
|  | ```csharp | |||
|  | int initalValue = 12;  | |||
|  |  try  | |||
|  |  {  | |||
|  |     // Code which manipulates 'initialValue'  | |||
|  |  }  | |||
|  |  finally  | |||
|  |  {  | |||
|  |     Console.WriteLine("re-initalising value back to 12");  | |||
|  |     initialValue = 12;  | |||
|  |  }  | |||
|  | 
 | |||
|  | ``` |