Какие ошибки я должен обработать?Какие из них "смертельно"? - PullRequest
5 голосов
/ 01 ноября 2011

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

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

Я бы хотел обработать все "некритические «ошибки» (например, неверные имена файлов), в то же время позволяя «критическим ошибкам» (например, нарушениям доступа) приводить к сбою моей программы.

В идеале я бы сказал:

// ... an error occurred. Is it a programmer error?

if (IsErrorCritical(GetLastError()))
{
    // Yes; raise an exception, crashing the program.
    RaiseException(GetLastError(), 0, 0, NULL);
}

Как я могу решить, какие коды ошибок безопасно подавлять (например, при перечислении файлов на диске), когда я не могу предсказать каждый результат?

Ответы [ 2 ]

4 голосов
/ 01 ноября 2011

«Критическое» зависит от того, что вы делаете с файлом.

Любой код ошибки может быть вызван либо ошибкой программиста, либо какой-то исключительной вещью на работающей машине; Я не думаю, что это важное различие в обработке ошибок.

Для ошибок, которые вы не обрабатываете специально («неизвестные»), просто предположите, что файл не был создан, и обработайте этот случай. Неважно, ПОЧЕМУ он не был создан, просто предположите, что это не было, и объясните этот сценарий. В зависимости от того, что делает ваш код и сколько усилий вы хотите приложить к этому сценарию, он может быть фатальным или нет.

Обратите внимание, что нарушения доступа - это не то, о чем GetLastError() знает, поэтому я не понимаю, какое это имеет отношение к вашему вопросу.

3 голосов
/ 01 ноября 2011

Я думаю, что это действительно зависит от контекста, вообще невозможно решить это, вместо этого его нужно решать в каждом конкретном случае.

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

...