Обработка ошибок. Некоторые ошибки сразу видны среде разработки, которая не дает скомпилировать убогую программу (и про себя ругает кривые руки программиста)

Некоторые ошибки сразу видны среде разработки, которая не дает скомпилировать убогую программу (и про себя ругает кривые руки программиста). Но самые опасные ошибки происходят во время работы программы. Пример ошибки, которую не может заметить среда разработки - обращение к несуществующему элементу списка. Элементов всего 2, а мы пытаемся прочитать третий. Можно было бы усложнить задачу - в реальной жизни мы скорее всего получим извне список с неизвестным заранее числом элементов, но для тестового примера в этом нет смысла. Обратите внимание, что такая ошибка невозможна при использовании цикла foreach.

static void Main(string[] args)

static void Main(string[] args)

{

List<Person> personsList = new List<Person>();

personsList.Add(new Person("Пушкин", "Александр", "Сергеевич"));

personsList.Add(new Person("Гончарова", "Наталья", "Николаевна"));

for (int counter = 0; counter < 4; counter++)

{

Console.WriteLine(personsList[counter].Fio);

}

Console.ReadLine();

}

В среде разработки такая ошибка выглядит так

и вернуться к редактированию кода можно так

А при запуске программы напрямую из exe-файла так

В чем философский смысл такой ошибки? Компьютер не знает что ему делать! Он же в конце-концов простая железяка и программист должен объяснить, как поступать в непредвиденной ситуации. Но для этого сам программист должен как-то узнать что именно происходит. Поэтому для ошибок в.Net и C# существует механизм исключений. Как несложно догадаться, ошибка, которую в среде.Net зовут исключением (Exception) - это тоже класс, экземпляр которого выбрасывается в случае вышеописанной ситуации, а программист должен ошибку поймать и что-сделать. Используется для этого конструкция try-catch

Внутри try помещается код, который может вызвать ошибку. Внутри catch код, который будет что-то делать с ошибкой. По идее внутрь try надо помещать поменьше кода, но в несколько уродливом примере ниже упор сделан на наглядность отображения событий, происходящих при возникновении исключительной ситуации.

static void Main(string[] args)

{

List<Person> personsList = new List<Person>();

personsList.Add(new Person("Пушкин", "Александр", "Сергеевич"));

personsList.Add(new Person("Гончарова", "Наталья", "Николаевна"));

for (int counter = 1; counter <= 2; counter++)

{

try

{

Console.WriteLine("Код ДО операции, в которой может произойти ошибка");

Console.WriteLine(personsList[counter].Fio);

// в случае возникновении ошибки выполнение прервется на этом месте и перейдет в блок catch

Console.WriteLine("Код ПОСЛЕ операции, в которой может произойти ошибка");

}

catch (Exception error)

{

Console.WriteLine("Произошла ошибка! Информация об ошибке " + error.Message);

}

finally

{

Console.WriteLine("Код внутри необязательного блока finally выполнится вне зависимости от того, произошла ошибка или нет");

Console.WriteLine();

}

}

Console.ReadLine();

}

Само собой вместо банального вывода сообщения на экран можно писать сообщение в файл с журналом ошибок или пытаться как-то исправить ситуацию. Но даже такие простые действия спасают компьютер от экзистенциального ужаса при столкновении с неизвестным

Подробнее в документации Microsoft


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: