freeCodeCamp/guide/russian/csharp/try-catch/index.md

108 lines
5.9 KiB
Markdown
Raw Normal View History

2018-10-12 20:00:59 +00:00
---
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;
}
```