- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
transaction::~transaction()
{
if (db_) {
int rc = db_->execute(fcommit_ ? "COMMIT" : "ROLLBACK");
if (rc != SQLITE_OK)
throw database_error(*db_);
}
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+170
transaction::~transaction()
{
if (db_) {
int rc = db_->execute(fcommit_ ? "COMMIT" : "ROLLBACK");
if (rc != SQLITE_OK)
throw database_error(*db_);
}
}
(c) http://code.google.com/p/sqlite3pp/source/browse/trunk/sqlite3pp.cpp#486
пожалуй, здесь нехватает картинки в стиле Nichtlustig с подписью "лемминг делает throw в деструкторе"
Кстати, вроде бы в C++0x деструкторы сделали nothrow. Чтобы не искушать.
В данном случае проблема именно в этом. Т.е. проблема тут не в наличии 'throw', а в отсутствии локального 'catch'.
Я думаю, это подразумевалось. Просто не было так развернуто, как у Вас.
С другой стороны, особого смысла делать локальные throw/catch как-то неожиданно - проще выйти по условию.
По поводу (не-)возможности бросания исключений из деструктора, все верно - если команда на уничтожение поступила - обьект должен быть удален безусловно, особенно при наличии во многих языках сборщика мусора - который вряд ли решит корректно, что делать, если обьект не мог быть удален.
Еще одна причина, почему это бессмысленно - если ресурс с обьектом недоступен - значит, он тоже не существует (хотя бы в данный момент), следовательно, "связь" с обьектом нарушена, следовательно - и обьект тоже превратился в мусор.
А задача по уборке мусора (что-то вроде "дефрагментации") должна выполняться сторонним процессом.
Что и требовалось доказать
+1