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

108 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
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;
}
```