2014-10-15 2 views
1

Я пишу приложение C++, которое должно обрабатывать коды ошибок из API C, в частности API WinSock2. Я не уверен в лучшем способе справиться с фатальными ошибками и нефатальными ошибками.Обработка исключений и восстановление из нефатальных ошибок

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

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

Должен ли я вернуть код ошибки в случаях, не связанных со смертельным исходом? Если мне также нужно вернуть значение, мне нужно будет вернуть как код (потенциальный успех), так и значение. Или я должен сделать две классификации исключений, что-то вроде FatalError и классы NonFatalError, и попытаться восстановить только при обработке исключений NonFatalError? Или есть другие/лучшие способы сделать это?

[Обновлено] Разъяснение
Там, кажется, некоторая путаница относительно того, что я клоню с оригинальным вопросом. Я понимаю, как обрабатываются исключения, что происходит, когда они не являются, перечеркивая исключения и их характеристики производительности.

Я прошу о методах/лучших практиках, чтобы справляться с ситуациями, которые на самом деле не являются «исключительными». В этом случае могут возникнуть ошибки, которые могут привести к тому, что соединение станет непригодным, но не повлияет на остальную часть сервера.

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

+0

Используйте 'throw;' в вашем catch, если вы не хотите его обрабатывать. Без поддержки, который заканчивает программу через terminate(). Бам, мертв, нет подсказки для пользователя. –

+0

«Исключения против кодов возврата» довольно ортогонально «Является ли это фатальным или нет». – JBL

ответ

0

Вы можете использовать исключения, если хотите развернуть ошибку до вызова. Создайте свои собственные классы, которые наследуются от std :: exception, и поймайте их, если вы хотите применить конкретное обращение.

try { 
    my_function_which_throws(); 
} catch (const FatalError& e) { 
    // do something, or rethrow 
} catch (const NonFatalError& e) { 
    // log or do nothing 
} 

Исключения составляют только время, чтобы обработать, если они брошены. Если ваша функция ничего не бросает, это не повлияет на производительность.