Книга: Системное программирование в среде Windows

Сочетание блоков finally и except

Сочетание блоков finally и except

Один try-блок может иметь только один блок finally или только один блок except, но не может иметь оба указанных блока одновременно. Поэтому нижеприведенный код вызовет появление ошибок на стадии компиляции. 

__try {
 /* Блок контролируемого кода. */
} __except (filter_expression) {
 /* Блок обработчика исключений. */
} __finally {
 /* Так делать нельзя! Это приведет к ошибке на стадии компиляции. */
}

Вместе с тем, допускается вложение одного блока в другой, что используется довольно часто. Нижеприведенный код является вполне работоспособным и обеспечивает гарантированное удаление временных файлов при выходе из цикла под управлением программы или в результате возникновения исключения. Эта методика оказывается удобной и в тех случаях, когда требуется обеспечить гарантированную отмену блокирования файлов, что будет использовано в программе 4.2. Кроме того, в коде имеется внутренний блок try…except, размещенный в том месте программы, где выполняются вычисления, в которых участвуют вещественные числа.

 __try { /* Внешний блок try-except. */
  while (…) __try { /* Внутренний блок try-finally. */
   hFile = CreateFile(TempFile, …);
   if(…) __try { /* Внутренний блок try-except. */
    /* Разрешить FP-исключения. Выполнить вычисления. */
    …
   } __except(EXCEPTION_EXECUTE_HANDLER) {
    … /* Обработать FP-исключение. */
    _clearfp();
   }
   … /* Обработка исключений, не являющихся FP-исключениями. /*
  } __finally { /* Конец цикла while. */
   /* Выполняется на КАЖДОЙ итерации цикла. */
   CloseHandle(hFile);
   DeleteFile(TempFile);
  }
 } __except (filter-expression) {
 /* Обработчик исключений. */
}

Оглавление книги


Генерация: 1.352. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз