Я пишу приложение C++, которое должно обрабатывать коды ошибок из API C, в частности API WinSock2. Я не уверен в лучшем способе справиться с фатальными ошибками и нефатальными ошибками.Обработка исключений и восстановление из нефатальных ошибок
Например, если мой вызов send()
с кодом ошибки WSAECONNABORTED
, я хочу вернуть ошибку вызывающему абоненту, но продолжить выполнение программы. В этом случае вызывающий абонент будет отмечать соединение как завершенное и продолжающееся. Но если он не с ошибкой, я бы хотел считать фатальной, например WSAENETDOWN
, я хочу, чтобы приложение завершилось.
Я знаю, что исключения используются для «исключительных» ситуаций, поэтому имеет смысл использовать исключения для обработки фатальной ошибки. Я задаюсь вопросом, как обрабатывать случаи нефатальной ошибки.
Должен ли я вернуть код ошибки в случаях, не связанных со смертельным исходом? Если мне также нужно вернуть значение, мне нужно будет вернуть как код (потенциальный успех), так и значение. Или я должен сделать две классификации исключений, что-то вроде FatalError
и классы NonFatalError
, и попытаться восстановить только при обработке исключений NonFatalError
? Или есть другие/лучшие способы сделать это?
[Обновлено] Разъяснение
Там, кажется, некоторая путаница относительно того, что я клоню с оригинальным вопросом. Я понимаю, как обрабатываются исключения, что происходит, когда они не являются, перечеркивая исключения и их характеристики производительности.
Я прошу о методах/лучших практиках, чтобы справляться с ситуациями, которые на самом деле не являются «исключительными». В этом случае могут возникнуть ошибки, которые могут привести к тому, что соединение станет непригодным, но не повлияет на остальную часть сервера.
Предпочтительно, чтобы исключить класс исключения для каждого кода ошибки, поскольку это создало бы много, в основном, бесполезных классов исключений.
Используйте 'throw;' в вашем catch, если вы не хотите его обрабатывать. Без поддержки, который заканчивает программу через terminate(). Бам, мертв, нет подсказки для пользователя. –
«Исключения против кодов возврата» довольно ортогонально «Является ли это фатальным или нет». – JBL