Главная Обратная связь

Дисциплины:






Обработка исключений. При выполнении программы часто возникают ситуации, в которых следование основному алгоритмы невозможно



При выполнении программы часто возникают ситуации, в которых следование основному алгоритмы невозможно. Например, нужно разделить одно число на другое, а знаменатель равен 0. Нужно вызвать метод объекта, а ссылка на него равна null и т.п.

Такие ситуации называются исключительными. Чтобы не возникало путаницы, лучше не называть их ошибками, так как под ошибками обычно понимают неправильное функционирование программы.

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

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

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

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

Синтаксически это оформляется так:

Try

{

… Охраняемый код

}

catch (ExceptionA e)

{

… Обработка исключений типа ExceptionA

}

catch (ExceptionB e)

{

… Обработка исключений типа ExceptionB

}

catch (Exception e)

{

… Обработка исключений всех потомков класса Exception

}

Finally

{

… Обязательное исполнение, не зависимо от того, возникало ли исключение в процессе работы программы

}

 

Фрагмент 11. Пример структуры оператора try-catch-finally.

Работает эта схема так. Во всех случаях, когда выполнение действия не возможно, система генерирует Исключение – объект потомок класса Exception. Если исключение возникло в блоке try, то оно перехватывается последующими обработчиками (catch - поймать). Перехват выполняется последовательно до первого совпадения. В нашем случае сначала проверяется не может ли возникшее исключение быть приведено к типу ExceptionA. Если может, то выполняется соответствующий блок catch и на этом обработка исключения заканчивается. Если текущее исключение не может быть приведено к ExceptionA, то проверяется возможность приведения к ExceptionB и т.п. К типу Exception приводятся все исключения, так что если очередь до него дойдет, то все исключения будут перехвачены.



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

Блок finally может присутствовать ии отсутствовать. Если он присутствует, то он выполняется всегда, не зависимо от того, возникало ли исключение в охраняемом коде.

После блока try должен идти хотя бы один блок catch или finally, иначе это будет трактоваться как синтаксическая ошибка.

Исключения генерирует не только .Net framework. Это может делать и сам программист. Вброс исключения в систему обработки ошибок выполняется оператором

throw new MyException(“Сообщение об ошибке”);

 

Подробнее познакомиться с применением try-catch-finally можно по ссылке: http://msdn.microsoft.com/ru-ru/library/dszsf989.aspx

 

Хорошая практика применения системы обработки исключений требует выполнения следующего правила: “Если исключение перехвачено, то его нужно обязательно обработать”. Обработка зависит от вида программы. Серверные программы, как правило, делают запись в лог о причине и месте возникновения исключения и продолжают работу. Программы, работающие с пользователем, часто сообщают об ошибке пользователю. Но нельзя оставлять блок обработки пустым. Это приведет к тому, что возникшие исключения не будут иметь видимых проявлений, но программа работать правильно не будет!





sdamzavas.net - 2017 год. Все права принадлежат их авторам! В случае нарушение авторского права, обращайтесь по форме обратной связи...