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