Читайте также: |
|
При выполнении любой сложной программы возможно возникновение ситуаций, нарушающих нормальный процесс ее выполнения (например, отсутствует файл данных, делитель выражения равен нулю и т. п.). Такие ситуации принято называть исключительными.
Правильно написанная программа должна в подобных случаях предусматривать выполнение корректирующих действий, например, выдачу соответствующей информации пользователю, предложение ему вариантов выхода из аварийной ситуации.
В небольших программах такие действия предусмотреть несложно. В больших же программах, в том числе написанных с использованием ООП, обработка аварийных ситуаций превращается в достаточно сложную задачу, так как нарушения обнаруживаются в одном месте программы (объектом, выполняющим операции), а возможная коррекция должна быть предусмотрена в другом (в объекте, инициирующем эти операции).
Для программирования корректирующих действий в таких случаях используют механизм обработки исключений. Он базируется на том, что обработка некорректных ситуаций выполняется в два этапа:
· генерация исключения — получение информации о возникновении ошибки;
· перехват исключения — обработка этой информации.
При перехвате исключений используется стек вызовов, в котором в момент передачи управления очередному методу фиксируется адрес возврата. Например, если метод A вызывает метод B, а тот в свою очередь вызывает метод C, то в стеке последовательно записываются: адрес возврата в A и адрес возврата в B.
Ошибка, обнаруженная в C, может быть обработана в самом методе C, а может быть передана для обработки в B или в A, или даже в методы, вызвавшие A. Для этого в одном из них необходимо предусмотреть обработчик исключения, соответствующий обнаруженной ошибке. Его поиск осуществляется следующим образом.
Вначале проверяется, не описан ли требуемый обработчик в C. Если он отсутствует, то по стеку вызовов определяется метод B, и проверяется наличие обработчика в нем. Не обнаружив обработчика в B, система по стеку определит метод A, и продолжит поиск в нем. Обратный просмотр стека будет продолжаться до тех пор, пока не обнаружится обработчик требуемого типа или не выяснится, что такой обработчик в программе не определен. В последнем случае программа завершается аварийно.
Механизм обработки исключений предполагает использование двух конструкций. Обрабатывающая конструкция try … catch обеспечивает выполнения описанного выше алгоритма. Операторы обработки исключения catch выполняются только если при выполнении фрагмента программы в блоке try генерируется исключение указанного типа.
Финализирующая конструкция try … finally используется, если необходимо обеспечить правильное освобождение ресурсов программы (освобождения памяти, закрытия файлов и т. д.). Завершающий блок операторов finally выполняется в любом случае: как при обнаружении исключения, так и при его отсутствии (даже если в блоке try присутствует оператор return).
Возможны три результата обработки исключения:
· обработчик исключения требуемого типа не обнаружен — выполняется аварийное завершение программы;
· обработчик исключения обнаружен — исключение обрабатывается, и выполнение программы продолжается;
· обнаружен фрагмент, включающий завершающую конструкцию — выполняются операторы завершающей обработки, и программа продолжается с операторов, следующих за блоком завершения.
Механизм обработки исключения языка C# позволяет перехватывать и обрабатывать исключения только класса Exception и производных от него классов. Основные виды исключений достаточно подробно представлены в справочной системе.NET Framework.
Пример 14. Обработка исключений, генерируемых системой.
class Program
{
static void Main(string[] args)
{
int numerator, denominator, result;
try
{
string tmp = Console.ReadLine();
numerator = Convert.ToInt32(tmp);
tmp = Console.ReadLine();
denominator = Convert.ToInt32(tmp);
result = numerator / denominator;
tmp = Convert.ToString(numerator / denominator);
Console.WriteLine(result);
}
catch (FormatException)
{
Console.WriteLine("Invalid number format!");
}
catch (DivideByZeroException)
{
Console.WriteLine("Attemted to divide by zero!");
}
finally
{
Console.WriteLine("Divide example.");
}
Console.ReadKey();
}
}
Обычно исключения генерируются системой. Программист может самостоятельно организовать генерацию необходимого (возможно нестандартного) исключения с помощью оператора throw.
Пример 14. Обработка исключений, генерируемых программой.
class Program
{
static void Main(string[] args)
{
try
{
string tmp = Console.ReadLine();
numerator = Convert.ToInt32(tmp);
tmp = Console.ReadLine();
denominator = Convert.ToInt32(tmp);
if (denominator == 0)
//
// Генерация исключения
throw new Exception("Attemted to divide by zero!");
result = numerator / denominator;
tmp = Convert.ToString(numerator / denominator);
Console.WriteLine(result);
}
catch (FormatException)
{
Console.WriteLine("Invalid number format!");
}
catch (Exception error)
{
Console.WriteLine("Message: " + error.Message);
}
finally
{
Console.WriteLine("Divide example.");
}
Console.ReadKey();
}
}
Дата добавления: 2015-07-25; просмотров: 65 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Разработка программ с использованием ООП | | | НАИВЫСШИЕ РЕЙТИНГИ РОССИЙСКИХ ШАШИСТОВ на 1 января 2012 г. |