На мой взгляд, нет. Недостатком является много дополнительного __try
/ __finally
шума, и я не вижу, что это такое.
SelectObject(hDCCompat, hBmpCompat);
BitBlt(hDC, ..., hDCCompat, ...);
Как вы ожидаете, что они потерпят неудачу? Например, SelectObject
сообщает об ошибке, возвращая NULL
(который вы не проверяете), а не вызывая исключение SEH. Многие экземпляры исключений SEH указывают на фундаментальную ошибку, которую невозможно исправить (вы испортили память или допустили логическую ошибку, например, передали недопустимый дескриптор функции или чему-то еще). Ошибки такого рода не могут быть обработаны изящно, и сбой обычно легче отладить.
Если вы хотите сделать свой код устойчивым перед лицом ранних возвратов (что во многих стандартах кодирования C не способствует, отчасти по этой причине), тогда вам следует рассмотреть возможность структурирования кода таким образом, чтобы его было сложнее модифицировать в опасном пути. Э.Г.
int f()
{
int ret;
Resource r;
if (!AcquireResource(&r))
return FAIL;
ret = FunctionWithLogicAndEarlyReturns(&r);
CleanupResource(&r);
return ret;
}
Вы можете надеяться, что, поскольку эта функция проста, будет мало соблазна добавить дополнительные ранние возвраты, ранние возвраты в вызываемой «логической» функции не повредят очистке полученного ресурса.