Re[4]: RAII + exceptions в избранное  новое всё   подписка   модер. 
От: Кодт модератор 
Дата: 18.03.10 16:56
Оценка: +1
Здравствуйте, uzhas, Вы писали:

GN>>И кстати для любителей экзотики добавлю: освобождение памяти тоже может породить отказ оборудования, как решить это проблему c delete?

U>вы очень сильно отвлеклись от темы
U>особенности работы с физикой лучше обсуждать в отдельной ветке
U>данная ветка немного о другом : есть API, который возвращает ошибки или исключения в случае каких-то обстоятельств. как грамотно обрабатывать такие ошибки в парадигме RAII для языка C++?
U>delete вроде бы в своем API не описывает возможные исключения или коды ошибок
U>всякие close, CloseHandle, transaction->Rollback() возвращают коды ошибок. надо их грамотно обрабатывать. вопрос не в том, что это за коды и почему они возникли, а в том как обрабатывать эти коды.

У нас, грубо говоря, есть два сценария:
1) открыть — попользоваться — забыть (и закрыть)
2) открыть — попользоваться — закрыть и убедиться — забыть (уже закрытое)

Кто мешает писать close(), commit(), rollback() и т.п. явно?
И обрабатывать ошибки можно прекрасно.
Handle h;
try
{
  h.open();
  h.work();
  if(explicitly)
  {
    result = h.close();
    if(bad(result)) { ..... }
  }
}
catch(Exception)
{
  if(explicitly)
  {
    result = h.close();
    if(bad(result)) { ..... }
  }
}
// здесь, если забыли или не захотели закрывать явно
// h.~Handle() --> if(h.is_open()) (void)h.close()


Так что RAII не отменяет явную обработку конца, и даже не маскирует проблему. А помогает там, где на самом деле проблемы нет.
Перекуём баги на фичи!