2012-05-23 1 views
1

У меня есть сторонняя библиотека C, которая может вылетать при ошибке CRT. В этом случае происходит сбой всего процесса. Есть ли способ уловить все ошибки CRT и предотвратить завершение процесса.Как предотвратить сбой процесса при ошибке CRT C++

+0

Проверьте входные данные на функции библиотеки, которые вы используете. Проверьте состояние библиотеки ((для потоковой) инициализации?). Если все хорошо, сообщите об ошибке с поставщиком библиотеки. – sehe

+0

Наверное, нет. '__TRY' может работать, если вы используете Windows или сигнал в Unix в зависимости от того, что такое точное исключение. Что это? – Rup

+0

http://msdn.microsoft.com/en-us/library/969zc1ac.aspx Похоже, что вы SOL (вторая функция снизу, не может этого сделать). –

ответ

4

Предотвращение аварии, вероятно, просто задерживает проблему.

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

Вместо этого попытайтесь выяснить, что точная проблема заключается в:

  • вы передавая неверные аргументы функции в библиотеке 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; 
    } 
+0

Если что-нибудь, вы должны попытаться быстрее и быстрее. –

+0

_try не помогло. Библиотека выполняет разбор текста и вызывается с пользовательским вводом. Он подавляет некоторые тексты, но я ничего не могу с этим поделать. Я хочу показать пользователю сообщение и закрыть поток, а не весь процесс процесса сервера – mayap

+0

Какой механизм обработки исключений вы укажете в командной строке компилятора? Я использую/EHsc и, похоже, работает правильно в моем случае. – Patrick

1

Какая жалость, никто не понимает. Ошибка CRT не имеет ничего общего с SEH, поэтому ее нельзя поймать _ попробуйте ... _except. Вы должны использовать функции _set_invalid_parameter_handler и _set_purecall_handler, обрабатывающие ошибку CRT.

http://crashrpt.sourceforge.net/docs/html/exception_handling.html

 Смежные вопросы

  • Нет связанных вопросов^_^