Без сомнения, многие люди знакомы с шаблоном ScopeGuard мистера Александрескуса (теперь часть Loki) и новой версией ScopeGuard11, представленной здесь: http://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012-Andrei-Alexandrescu-Systematic-Error-Handling-in-C
с исходным кодом здесь: https://gist.github.com/KindDragon/4650442
В своем выступлении на c++ и после 2012 года он упомянул, что не может найти способ правильно определить, выходит ли область действия из-за исключения. Поэтому он не мог реализовать макрос SCOPE_FAIL, который выполнял бы предоставленную лямбду (обычно используемую для кода отката) тогда и только тогда, когда область вышла из-за исключения. Это сделало бы функцию-член reject() ненужной и сделало бы код более читабельным.
Поскольку я ни в коем случае не такой гений или опытный, как г-н Александреску, я ожидаю, что реализовать SCOPE_FAIL будет не так просто:
~ScopeGuard11(){ //destructor
if(std::uncaught_exception()){ //if we are exiting because of an exception
f_(); //execute the functor
}
//otherwise do nothing
}
Мой вопрос: почему бы и нет?
uncaught_exception()
всегда возвращаетfalse
. - person Andy Prowl   schedule 18.02.2013std::uncaught_exception
, поскольку защита области никогда не будет членом другого класса (и, конечно, не локальной переменной в деструкторе какого-либо класса). - person Xeo   schedule 18.02.2013std::uncaught_exception()
кажется, что все время возвращаетfalse
. Возможно это баг, или я что-то упускаю из виду? - person Andy Prowl   schedule 18.02.2013catch
, так как исключение уже перехвачено. Вы можете использовать его только в деструкторе. - person JiaHao Xu   schedule 09.10.2018