try/catch/finally, создание исключения и повторный выброс
Используйте try/catch/finally для предсказуемой обработки ошибок; разберитесь в различиях между throw new и повторным выбросом; делайте примеры небольшими и сосредоточенными.
«try/catch/finally, создание исключения и повторный выброс» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.
Обзор исключений
Цель: безопасно обрабатывать ошибки и передавать их выше.
- try/catch: обрабатывать конкретные исключения
- finally: всегда выполняется для очистки
- throw new и повторный выброс
- Делайте обработчики короткими; не скрывайте ошибки
Обработка конкретного исключения
Перехватывайте наиболее конкретное ожидаемое исключение; обработчик должен быть коротким и понятным.
using System;
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Start");
try
{
int x = 10;
int y = 0; // will cause DivideByZeroException
Console.WriteLine(x / y);
}
catch (DivideByZeroException ex)
{
Console.WriteLine("Cannot divide by zero: " + ex.GetType().Name);
}
Console.WriteLine("Continue");
}
}
Порядок обработчиков
Порядок важен: размещайте конкретные обработчики первыми, а общий обработчик Exception — последним, как средство защиты.
using System;
public class Program
{
static int ParseAndDivide(string text, int divisor)
{
// Throws FormatException or DivideByZeroException
int value = int.Parse(text);
return value / divisor;
}
public static void Main(string[] args)
{
try
{
Console.WriteLine(ParseAndDivide("not-a-number", 2));
}
catch (FormatException)
{
Console.WriteLine("Bad number format");
}
catch (Exception ex)
{
// Fallback last
Console.WriteLine("Other error: " + ex.GetType().Name);
}
}
}
finally для очистки
Помещайте очистку в finally. Этот блок выполняется независимо от того, произошло исключение или нет.
using System;
public class Program
{
static bool opened = false;
static void UseFakeResource()
{
try
{
opened = true;
Console.WriteLine("Open");
throw new InvalidOperationException("boom");
}
catch (InvalidOperationException)
{
Console.WriteLine("Handled");
}
finally
{
opened = false; // cleanup path
Console.WriteLine("Close");
}
}
public static void Main(string[] args)
{
UseFakeResource();
Console.WriteLine("Opened? " + opened);
}
}
Правильный повторный выброс
Используйте throw; для повторного выброса и сохранения исходного стека вызовов. throw ex; сбрасывает его. Оборачивайте исключение в новое только при добавлении контекста.
using System;
public class Program
{
static void BadRethrow()
{
try
{
Fail();
}
catch (Exception ex)
{
// Resets stack trace:
throw ex; // BAD rethrow
}
}
static void GoodRethrow()
{
try
{
Fail();
}
catch
{
// Preserves original stack trace:
throw; // GOOD rethrow
}
}
static void Fail()
{
throw new InvalidOperationException("fail");
}
public static void Main(string[] args)
{
try { BadRethrow(); }
catch (Exception ex)
{
Console.WriteLine("Bad: " + (ex.StackTrace == null ? "no stack" : "stack reset likely"));
}
try { GoodRethrow(); }
catch (Exception ex)
{
Console.WriteLine("Good: preserves original stack");
}
}
}
Рекомендации по обработке
Рекомендации:
- Перехватывайте исключение, если можете его обработать или добавить контекст.
- В противном случае позвольте ему подняться выше.
- Делайте обработчики небольшими; не подавляйте исключения молча.
- Используйте finally для очистки; освобождению ресурсов посвящён следующий урок.
Правило повторного выброса
Повторение
Повторение: используйте try/catch для конкретных ошибок, finally для очистки и отдавайте предпочтение throw; при повторном выбросе, чтобы сохранить исходный стек.
Часто задаваемые вопросы
Урок «try/catch/finally, создание исключения и повторный выброс» бесплатный?
Да — полный текст урока «try/catch/finally, создание исключения и повторный выброс» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.
Чему я научусь в уроке «try/catch/finally, создание исключения и повторный выброс»?
Используйте try/catch/finally для предсказуемой обработки ошибок; разберитесь в различиях между throw new и повторным выбросом; делайте примеры небольшими и сосредоточенными. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.
Сколько времени занимает урок «try/catch/finally, создание исключения и повторный выброс»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- try/catch/finally, создание исключения и повторный выброс
- Пользовательские исключения и проектирование ошибок
- IDisposable и оператор using