0Pricing
C# Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. try/catch/finally, создание исключения и повторный выброс
  2. Пользовательские исключения и проектирование ошибок
  3. IDisposable и оператор using
← Назад к C# Academy