powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Есть универсальные решения для отлова исключений типа divide by zero, seg-falut?
1 сообщений из 1, страница 1 из 1
Есть универсальные решения для отлова исключений типа divide by zero, seg-falut?
    #38296394
Есть какие-то универсальные решения для отлова исключений типа divide by zero, segmentation fault и т.д. в компиляторах MSVC, GCC, Clang или универсальные обертки для них, например в boost?

Наверняка должно быть универсальное решение с учетом нюансов каждого компилятора.
Даже если я сам напишу подобную портянку под каждый компилятор, то все равно могу не учесть какие-то нюансы.
Например как в MSVC с SEH-исключениями:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
#include<iostream>
#include<string>
 
#ifdef _MSC_VER
#include <windows.h>
#include <eh.h>

//Класс-обертка, которая хранит в себе информацию об исключении.
class SE_Exception
{
private:
	EXCEPTION_RECORD m_er; 
	CONTEXT m_context; 
	unsigned int m_error_code;
public:
   	SE_Exception(unsigned int u, PEXCEPTION_POINTERS pep) 
	{
		m_error_code = u;
		m_er = *pep->ExceptionRecord; 
		m_context = *pep->ContextRecord;
	}
   	~SE_Exception() {}
	unsigned int get_error_code() const { return m_error_code; }
	std::string get_error_str() const {
		switch(m_error_code) {
		case EXCEPTION_FLT_DENORMAL_OPERAND: return std::string("DENORMAL OPERAND");
		case EXCEPTION_FLT_DIVIDE_BY_ZERO:   return std::string("DIVIDE BY ZERO");
		case EXCEPTION_FLT_INEXACT_RESULT:   return std::string("INEXACT RESULT");
		case EXCEPTION_FLT_INVALID_OPERATION: return std::string("INVALID OPERATION");
		case EXCEPTION_FLT_OVERFLOW:	return std::string("OVERFLOW");
		case EXCEPTION_FLT_STACK_CHECK: return std::string("STACK CHECK");
		case EXCEPTION_FLT_UNDERFLOW:	return std::string("UNDERFLOW");

		case EXCEPTION_INT_DIVIDE_BY_ZERO: return std::string("INT DIVIDE BY ZERO");
		case EXCEPTION_INT_OVERFLOW:	return std::string("INT OVERFLOW");
			
		case EXCEPTION_ACCESS_VIOLATION: return std::string("ACCESS VIOLATION");
		case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:   return std::string("ARRAY_BOUNDS_EXCEEDED");
		case EXCEPTION_BREAKPOINT:   return std::string("BREAKPOINT");
		case EXCEPTION_DATATYPE_MISALIGNMENT: return std::string("DATATYPE MISALIGNMENT");
		case EXCEPTION_ILLEGAL_INSTRUCTION:	return std::string("ILLEGAL INSTRUCTION");
		case EXCEPTION_IN_PAGE_ERROR: return std::string("IN PAGE ERROR");
		case EXCEPTION_INVALID_DISPOSITION:	return std::string("INVALID DISPOSITION");

		case EXCEPTION_NONCONTINUABLE_EXCEPTION: return std::string("NONCONTINUABLE EXCEPTION");
		case EXCEPTION_PRIV_INSTRUCTION:	return std::string("PRIV INSTRUCTION");
		case EXCEPTION_SINGLE_STEP: return std::string("SINGLE STEP");
		case EXCEPTION_STACK_OVERFLOW:	return std::string("STACK OVERFLOW");
		}
		return std::string("UNKNOWN");
	}
};

void trans_func(unsigned int u, EXCEPTION_POINTERS* pExp)
{
    throw SE_Exception(u, pExp);
}

#else

struct SE_Exception
{
	unsigned int get_error_code() const { return 0; }
	std::string get_error_str() const { return std::string("Not MSVC compiler"); }
};
#endif

int main() {
#ifdef _MSC_VER
	_set_se_translator( trans_func );
#endif
    
    try {
        int a = 0;
        int b = 1 / a;
        std::cout << "b: " << b << std::endl;
    } catch(SE_Exception &e) {
		std::cout << "SEH exception: (" << e.get_error_code() << ") " << e.get_error_str() << std::endl;        
    } catch(...) {
        std::cout << "Unknown exception." << std::endl;        
    }
    
	int b;
	std::cin >> b;
    return 0;
}

...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Есть универсальные решения для отлова исключений типа divide by zero, seg-falut?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]