У меня есть сторонняя библиотека C, которая может вылетать при ошибке CRT. В этом случае происходит сбой всего процесса. Есть ли способ уловить все ошибки CRT и предотвратить завершение процесса.Как предотвратить сбой процесса при ошибке CRT C++
ответ
Предотвращение аварии, вероятно, просто задерживает проблему.
Представьте, что вы можете предотвратить сбой, но в результате пользователь сохранит неверные данные в базе данных или повредит файлы данных, тогда вы просто делаете проблему хуже.
Вместо этого попытайтесь выяснить, что точная проблема заключается в:
- вы передавая неверные аргументы функции в библиотеке 3 партии?
- или это ошибка в сторонней библиотеке? Противостоять изготовителю библиотеки с ошибкой.
В качестве альтернативы:
- пытаются найти работу вокруг проблемы
- найти альтернативу для библиотеки
EDIT: Честно говоря, я столкнулся аналогичную ситуацию в прошлом году с сторонним компонентом. Я сделал следующее:
Во-первых, используйте _ try/ _используйте конструкцию, чтобы поймать проблему. Это срабатывает только в том случае, если вы знаете, в какой функции он вызывает его сбой. Вот как это работает:
__try
{
Some3rdPartyLibraryFunction();
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
}
Во-вторых, чтобы предотвратить дальнейшее искажение вашего приложения, убедитесь, что библиотека третья сторона не называется больше внутри приложения. Например. Предположим, что библиотека является компонентом отчетности, а затем, если вы столкнулись с аварии, не позволяют пользователю больше открыть отчет, как это:
bool MyClass::openReport (char *reportname)
{
if (!reportModuleEnabled)
return false;
__try
{
OpenTheReport(reportname);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
// Tell the user about the problem and prevent further access to the library
ShowMessage ("Sorry, no more reports");
reportModuleEnabled = false;
return false;
}
return true;
}
Если что-нибудь, вы должны попытаться быстрее и быстрее. –
_try не помогло. Библиотека выполняет разбор текста и вызывается с пользовательским вводом. Он подавляет некоторые тексты, но я ничего не могу с этим поделать. Я хочу показать пользователю сообщение и закрыть поток, а не весь процесс процесса сервера – mayap
Какой механизм обработки исключений вы укажете в командной строке компилятора? Я использую/EHsc и, похоже, работает правильно в моем случае. – Patrick
Ваша программа работает на Windows? Вы пробовали обернуть код нарушения с помощью SEH? http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657(v=vs.85).aspx
Да Я попытался добавить фильтр необработанных исключений и перенаправить исключение, но не работал – mayap
Какая жалость, никто не понимает. Ошибка CRT не имеет ничего общего с SEH, поэтому ее нельзя поймать _ попробуйте ... _except. Вы должны использовать функции _set_invalid_parameter_handler и _set_purecall_handler, обрабатывающие ошибку CRT.
http://crashrpt.sourceforge.net/docs/html/exception_handling.html
Проверьте входные данные на функции библиотеки, которые вы используете. Проверьте состояние библиотеки ((для потоковой) инициализации?). Если все хорошо, сообщите об ошибке с поставщиком библиотеки. – sehe
Наверное, нет. '__TRY' может работать, если вы используете Windows или сигнал в Unix в зависимости от того, что такое точное исключение. Что это? – Rup
http://msdn.microsoft.com/en-us/library/969zc1ac.aspx Похоже, что вы SOL (вторая функция снизу, не может этого сделать). –