Отладка и тестирование приложений в среде Visual Studio 2005. Евсеева О.Н - 25 стр.

UptoLike

Составители: 

25
вать истинность постусловия по завершении своей работы. Если в вызванном
модуле возникает исключительная ситуация, то это означает, что он не может
выполнить свою часть контракта. Что должен делать обработчик исключитель-
ной ситуации? У него только две возможностиRetry и Rescue. Первая (Retry) –
попытаться внести некоторые коррективы и вернуть управление охраняемому
модулю, который может предпринять очередную попытку выполнить свой кон-
тракт. Модуль может, например, в следующей попытке запустить другой алго-
ритм, использовать другой файл, другие данные. Если все закончится успешно,
и работа модуля будет соответствовать его постусловию, то появление исклю-
чительной ситуации можно рассматривать как временные трудности, успешно
преодоленные. Если же ситуация возникает вновь и вновь, тогда обработчик
события применяет вторую стратегию (Rescue), выбрасывая исключение и пе-
редавая управление вызывающему модулю, который и должен теперь попы-
таться исправить ситуацию. Важная тонкость в схеме, предложенной Бертра-
ном, состоит в том, что исключение, выбрасываемое обработчиком, следует
рассматривать не как панику, не как бегство, а как отход на заранее подготов-
ленные позиции. Обработчик исключения должен позаботиться о восстановле-
нии состояния, предшествующего вызову модуля, который привел к исключи-
тельной ситуации, и это гарантирует нахождение всей системы в корректном
состоянии.
Схема Бертрана является схемой с возобновлением, и она наиболее точно
описывает разумную стратегию обработки исключительных ситуаций. Не сле-
дует думать, что эта схема не может быть реализована на C#, просто она требу-
ет понимания сути и определенной структурной организации модуля.
Приведем возможную реализацию такой схемы на C# и краткие коммен-
тарии к этой процедуре, которую можно рассматривать как некоторый образец
организации обработки исключительной ситуации:
public void Pattern()
{
do
{
try
{
bool Danger = false;
Success = true;
MakeJob();
Danger = CheckDanger();
if (Danger)
throw (new MyException());
MakeLastJob();
}
catch (MyException me)
{