Что такое исключение
Исключением является проблема, которая неожиданно появляется в нашем коде во время разработки проекта. Вот почему мы называем эти исключения необработанными исключениями. Если они не будут обработаны, то они приведут к тому, что наше приложение перестанет работать и выдаст одно из сообщений об исключении. Это не то, чего бы мы хотели в нашем коде.
Попвтка поймать исключение
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, иначе наш компилятор выдаст предупреждение: