
- •Введение
- •Создание простого приложения в ms Visual Studio
- •Отладка программы
- •Пошаговый режим
- •Точки останова
- •Безусловные точки останова
- •Условные точки останова
- •Просмотр переменных
- •Стек вызова функций
- •Разработка оконных приложений
- •Размещение компонентов на форме. Свойства компонента.
- •Компонент CheckBoxListBox
- •Переменные
- •Приведение типов
- •Операции, приоритет
- •Перегрузка операций
- •If(выражение_1) оператор_1
- •Циклы While
- •Цикл foreach
- •Программирование классов
- •Введение в классы и объекты в с#
- •Общий синтаксис класса
- •Поля и свойства
- •Использование переменного числа аргументов
- •Объявление объектов класса. Оператор new
- •Инциализация членов класса
- •Конструкторы и деструкторы
- •Ключевое слово this
- •Ключевое слово static
- •Наследование
- •Полиморфизм.
- •Абстрактные классы
- •Интерфейсы
- •Реализация интерфейсов
- •Интерфейсные свойства
- •Интерфейсные индексаторы
- •Массивы
- •Обработка исключительных ситуаций
- •Предварительная проверка параметров
- •Проверка кодов возврата функций и методов
- •Применение механизма исключений
- •Блоки try-catch
- •Применение блока finally
- •Массивы как коллекции
- •Коллекция ArrayList
Обработка исключительных ситуаций
Рассмотрим примеры возникновения компьютерных ошибок и ситуации, при которых они возникают.
Простейшим примером ошибки является деление на 0 и выход за границы массива.
Рассмотрим данную ошибку на примере.
using System;
namespace DivByZero
{
class DivbyZeroApp
{
static void Main(string[] args)
{
int i = 0;
int j = 5 / I; //ошибка
Console.Readline();
}
}
}
В данной программе объявляется 2 переменные типа int с именами i и j. Первой переменной присваивается нулевой значение, на которое делится вторая переменная. При компиляции ошибки выдано не будет, так как компилятор не следит за содержимым переменных. Однако при попытке запустить программу на экране появится сообщение об ошибке деления на нуль и произойдет закрытие программы. При подобных ошибках возможны возникновения серьезных проблем, вплоть до потери данных.
Предварительная проверка параметров
Качественно написанные программы не должны выдавать пользователю системное сообщение об ошибке. Обнаружив ошибку, программа должна сообщить пользователю причины возникновения ошибки, а также рекомендовать какие-либо действия. Для этого в программе предусматриваются блоки обработки ошибок. Рассмотрим пример программы, представленной ранее, с блоком обработки ошибок.
if(I != 0)
{
int j = 5 / i;
}
else Console.WriteLine(“Ошибка деления на нуль);
Большое количество ошибок вызывается тем, что функциям или методам передаются неправильные значения параметров. Чтобы предотвратить возникновение таких ошибок в программе должно быть предусмотрена проверка параметров на доступность перед передачей их в методы или функции. При пропуске подобных блоков повышается вероятность появления неожиданных и трудно обнаруживаемых ошибок.
Проверка кодов возврата функций и методов
Рассмотрим случай, когда мы вызываем метод обработки информации, выполняющего деление первого своего параметра на второй.
using System;
namespace DivByZero
{
class DivByZrolApp
static int Divide(int x, int y)
{
int result;
result = x / y;
}
static void Main{string[] args)
{
int j;
for (int i = -3; i <=3; i++)
{
j = Divide{10, i); // Ошибка деления на нуль
}
Console.ReadLine();
}
}
}
Для исправления этой ошибки изменим метод Divide, чтобы он проверял значение делителя перед выполнением операции деления:
static int Divide(int x, int у)
{
int result;
if (y != 0)
result = x / у;
return result;
}
else
return 0;
Теперь ошибка деления на нуль не возникнет, так как, если делитель равен нулю, деление не выполняется. Однако метод Divide должен каким-то образом просигнализировать вызывающему методу о возникновении ошибки.
Наша реализация этого метода при ошибке возвращает нулевое значение, однако очевидно, это не лучший способ. В самом деле, нулевое значение возвращается и в том случае, если делитель равен нулю, а эта ситуация не является ошибочной.
Заметим, что возвращение особого значения методом или функцией используется очень часто в других языках программирования в качестве признака ошибки.
Предполагается, что после обращения к функции операционной системы (такой, например, как открытие файла, чтение блока данных из этого файла и т. п.) вызывающая программа проверяет код возврата, предпринимая при возникновении ошибки какие-либо действия.
Вот как мы можем использовать модифицированный вариант метода Divide, возвращающий нулевое значение при возникновении ошибки деления на нуль:
j = Divide(10, i) ;
if (j == 0)
Console.WriteLinef "Ошибка деления на нуль");
В реальных программах встречается довольно большая глубина вложенности функций и методов, когда один метод вызывает другой, тот, в свою очередь, обращается к третьему и четвертому и т. д.
Строки листинга программы, предназначенные для обработки кодов возврата для всех этих функций или методов, загромождают исходный текст программы, делая его «нечитаемым». Кроме того, программист может по забывчивости опустить проверку кода возврата какой-либо одной функции или метода, что приведет к аварийному завершению приложения во время его работы.