Основы C# - Обработка исключений

Что такое исключение

Исключением является проблема, которая неожиданно появляется в нашем коде во время разработки проекта. Вот почему мы называем эти исключения необработанными исключениями. Если они не будут обработаны, то они приведут к тому, что наше приложение перестанет работать и выдаст одно из сообщений об исключении. Это не то, чего бы мы хотели в нашем коде.

Попвтка поймать исключение

C# предоставляет нам встроенную поддержку для обработки исключений с помощью следующей конструкции

try
{
    // код, который может привести к исключению
}
catch(Exception ex)
{
    // обработка исключения
}

Рассмотрим пример программы ниже

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Enter your number: ");
        int num = Convert.ToInt32(Console.ReadLine());

        Console.WriteLine(Math.Sqrt(num));
    }
}

Этот код будет работать нормально, если пользователь вводит целое число, но посмотрите, что произойдет, если пользователь введет строку:

Видим, что наше приложение перестало работать. Это очень плохо для пользователя. Итак, реализуем тот же код, но с обработкой ошибки, отловив исключение

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("Enter your number: ");
            int num = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine(Math.Sqrt(num));
            Console.ReadKey();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"There is something wrong in our application, please look at this message: {ex.Message}");
            Console.ReadKey();
        }
    }
}

Если мы проверим результат теперь:

Как мы видим, наше приложение не было остановлено, и у нас есть приятное для чтения сообщение для нашего пользователя, которое обеспечивает гораздо лучший пользовательский интерфейс, чем в предыдущем примере.

Особые исключения

В C# есть собственный набор особых исключений, которые мы можем использовать в нашем приложении. Некоторые из них: NullReferenceException, ArgumentOutOfRangeException, InvalidCastException, FileNotFoundException, DevideByZeroException, FormatException, InvalidOperationException и т.д.

Мы можем использовать их следующим образом:

public class Program
{
    public static void Main()
    {
        try
        {
            //Код, который может вызвать исключение
        }
        catch (DivideByZeroException ex)
        {
            Console.Write("Cannot divide by zero. Please try again.");
        }
        catch (InvalidOperationException ex)
        {
            Console.Write("Not a valid number. Please try again.");
        }
        catch (FormatException ex)
        {
            Console.Write("Not a valid number. Please try again.");
        }
        catch(Exception ex)
        {
            Console.Write("Any exception that previous catch blocks didn’t handle.");
        }
        Console.ReadKey();
    }
}

Очень важно поместить определенные блоки catch перед глобальным блоком catch, иначе наш компилятор выдаст предупреждение: