Один действительный случай исключения, оставляющий деструктор - PullRequest
1 голос
/ 09 февраля 2010

Я работаю над простым классом для управления временем жизни HKEY.

class Key
{
    HKEY hWin32;
public:
    Key(HKEY root, const std::wstring& subKey, REGSAM samDesired);
    Key(const Key& other);
    ~Key();
    Key& operator=(const Key& other);
    Key& swap(Key& other);
    HKEY getRawHandle() { return hWin32; };
};

 //Other Methods....

Key::~Key()
{
    LONG errorCheck
        = RegCloseKey(hWin32);
    /*
     * I know it's generally bad to allow exceptions to leave destructors,
     * but I feel that if RegCloseKey() is going to fail, the application
     * should be terminated. (Because it should never fail.)
     */
    if (errorCheck != ERROR_SUCCESS)
        WindowsApiException::Throw(errorCheck);
}

Это правильное рассуждение? Я не вижу, как еще можно сообщить вызываемому о сбое RegCloseKey().

Ответы [ 3 ]

5 голосов
/ 09 февраля 2010

Сбой RegCloseKey - это скорее ситуация assert, чем ошибка, которую необходимо передать по цепочке вызовов. Вы хотите сесть и сразу же заметить в отладочных сборках

Но что хорошего в том, что информация об ошибках будет полезна вызывающей стороне? Что он должен с этим делать?

0 голосов
/ 09 февраля 2010

Подумайте об этом так: причина игнорирования сообщения об ошибке - плохая, потому что, если что-то не работает, вы должны обработать его и что-то с ним сделать (например, предупредить пользователя, повторить попытку, что угодно). Однако в этом случае вы на самом деле не справляетесь с этим - вы просто завершаете приложение (что также является плохой практикой).

Я бы предположил, что определенно было бы полезно иметь утверждение, чтобы убедиться, что вы что-то ловите в отладочных сборках. Написание чего-либо с использованием OutputDebugString может быть хорошей идеей для сборок релиза. Таким образом, вы не игнорируете приложение при возникновении ошибки, вы записываете его, но не завершаете приложение ...

Завершение работы приложения без предупреждения или объяснения просто сбивает с толку и раздражает ваших пользователей .... Как бы вы объяснили это пользователю - «Ну, что-то, что я не могу объяснить, провалилось так, как никогда не должно происходить, и Я не могу игнорировать это, поэтому я должен выйти из приложения прямо сейчас! "?

Полагаю, моя точка зрения состоит в том, что утечка дескриптора, хотя и плохая, гораздо менее опасна, чем неожиданное завершение работы приложений.

0 голосов
/ 09 февраля 2010

Это не как правило плохо. Это это плохо!

Если выдается исключение, стек разматывается до тех пор, пока не будет выполнено условие catch. Если один из ваших объектов Key находится в стеке, будет вызван его деструктор. Если он выдает, у вас есть 2 исключения одновременно. В этом случае вызывается terminate (), поэтому у вас не будет возможности что-либо сделать с одним из ваших исключений.

...