Мне нужно поймать ошибку сегментации и другие неизвестные исключения в моем приложении. Но я не знаю, как я могу это сделать! Могу ли я использовать std :: uncaught_exceptions для этой цели?Является ли std :: uncaught_exceptions полезным для исключения всех исключений?
ответ
Могу ли я использовать
std::uncaught_exceptions
для этой цели?
Рассмотрим этот код:
int main(int argc, char* argv[])
{
int *val = NULL;
*val = 1;
std::cout << "uncaught: " << std::uncaught_exceptions() << std::endl;
return 0;
}
Это, вероятно, приведет к ошибке сегментации и ничего не будет выводиться.
Мне нужно поймать ошибку сегментации и другие неизвестные исключения в моем приложении. Но я не знаю, как я могу это сделать!
Обработка исключений в C++ можно сделать через try-catch
блок, и вы можете использовать функцию std::signal
поймать некоторые ошибки, как SIGSEGV
, SIGFPE
, or SIGILL
, например:
#include <iostream>
#include <exception>
#include <csignal>
#include <cstdio>
extern "C" {
void sig_fn(int sig)
{
printf("signal: %d\n", sig);
std::exit(-1);
}
}
int main(int argc, char* argv[])
{
int *val = NULL;
std::signal(SIGSEGV, sig_fn);
try {
*val = 1;
} catch (...) {
std::cout << "..." << std::endl;
}
if (std::uncaught_exception()) {
std::cout << "uncaught" << std::endl;
}
std::cout << "return" << std::endl;
return 0;
}
Но следует отметить, что этот тип исключения обработка действительно предназначена для очистки и выключения, а не для улова и выпуска; воспользуйтесь этим кодом, например:
#include <iostream>
#include <exception>
#include <csignal>
#include <cstdio>
extern "C" {
void sig_fn(int sig)
{
printf("signal: %d\n", sig);
}
}
int main(int argc, char* argv[])
{
int *val = NULL;
std::signal(SIGSEGV, sig_fn);
while (true) {
try {
*val = 1;
} catch (...) {
std::cout << "..." << std::endl;
}
}
if (std::uncaught_exception()) {
std::cout << "uncaught" << std::endl;
}
std::cout << "return" << std::endl;
return 0;
}
Этот код вызовет и поймает ошибку сегментации навсегда!
Если вы пытаетесь поймать ошибку сегментации, вам необходимо выяснить, почему в первую очередь произошла ошибка сегментации (или любая ошибка) и исправить эту проблему; используя код выше в качестве примера:
int *val = NULL;
if (val == NULL) {
std::cout << "Handle the null!" << std::endl;
} else {
*val = 1;
}
Для дальнейшего чтения: here is a SO Q&A на то, что это выдаёт ошибку сегментации, а также, here is the Wiki на нем, и MIT имеет некоторые советы по обработке и отладке тоже ошибки сегментации.
Надеюсь, что это поможет.
Первый пример - это неопределенное поведение в соответствии со стандартом C++. Вероятно, это приведет к segfault для каждой системы, с которой вы столкнетесь в своем опекуне, в качестве программиста, но никаких гарантий. – user4581301
@ user4581301 .. технически все примеры являются UB, поскольку все они разыменовывают нулевой указатель; но, учитывая знание ФП об исключениях и сигналах, я больше пытался выразить, что ОП должен видеть это как ошибку (а не только UB); Я изменил _allways_ на _вероятно ... потому что этот код: 'int * v = NULL; попробуйте {* v = 1; } catch (...) {std :: cout << "..." << std :: endl; } 'работает" как ожидалось "в Windows, но не на других платформах (технически код все равно должен вызывать segfault, но обработчик прерываний внутреннего segfault Windows фактически тогда« бросает ошибку, которая поймана »). – txtechhelp
- 1. Почему std :: uncaught_exception изменится на std :: uncaught_exceptions?
- 2. Исключения действительны для всех исключений?
- 3. Является ли invoke исключения.fillInStacktrace полезным?
- 4. Является ли constexpr полезным для перегрузки
- 5. Является ли modernizr.js еще полезным?
- 6. Mac OSX LibC++ отсутствует StD :: uncaught_exceptions символ
- 7. Является ли отражение полезным для Android?
- 8. Является ли toString() полезным только для отладки?
- 9. Является ли Javascript полезным для изменения памяти?
- 10. Является ли доход полезным вне LINQ?
- 11. объекты для исключения исключений
- 12. Является ли @ContextHierarchy полезным из сценария наследования?
- 13. Является ли ORM (Linq, Hibernate ...) действительно полезным?
- 14. Является ли std :: thread :: id уникальным для всех процессов?
- 15. Является ли window.open() полезным в наши дни?
- 16. Исключение исключений от исключения исключений для ловушек
- 17. Является ли мое использование WCF асинк полезным?
- 18. Является ли наследование полезным в этом случае?
- 19. Является ли HttpContextWrapper всем этим .... полезным?
- 20. Исключения исключений исключений
- 21. Является ли шаблон состояния полезным для состояний только для чтения?
- 22. Является ли $ 1 полезным токеном в Lex?
- 23. Является ли режим разлома Perl полезным?
- 24. Является полезным растровым индексом
- 25. Является ли параллелизм полезным с блокировкой для транзакций записи данных
- 26. Пользовательские исключения исключений для заполнения для Choropleth
- 27. Исключения для исключения указателей исключений Отладка
- 28. Установите контрольную точку исключения для всех исключений, кроме отмены задачи
- 29. Является ли проверка нулевого значения в массиве значимым/полезным?
- 30. Захват всех исключений
No can can. Segfault создается ниже C++. Это не исключение или даже C++. – user4581301
Возможно, вы захотите прочитать: http://stackoverflow.com/questions/457577/catching-access-violation-exceptions –
Вам нужно поймать его и сделать * что * точно? На самом деле это не то, от чего вы можете спокойно оправиться. SEGV означает, что ваш код серьезно нарушен, вы, вероятно, должны инвестировать усилия в устранение основной причины. – paxdiablo