Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
|
никто не обещал, что c++-исключения обработают деление на ноль 14.11.05 00:11 Число просмотров: 3448
Автор: dl <Dmitry Leonov> Отредактировано 14.11.05 00:16 Количество правок: 1
|
Это можно перехватить с помощью структурных исключений Win32. Есть вариант и скрестить - см.
_set_se_translator
Если очень на пальцах, то примерно так:
#include <eh.h>
class SE_Exception
{
private:
unsigned int nSE;
public:
SE_Exception() {}
SE_Exception( unsigned int n ) : nSE( n ) {}
~SE_Exception() {}
unsigned int getSeNumber() { return nSE; }
};
inline void trans_func( unsigned int u, EXCEPTION_POINTERS* pExp )
{
throw SE_Exception(u);
}
inline void SetSETranslation()
{
_set_se_translator( trans_func );
}
---
После чего аппаратные исключения будут приводить к c++-исключениям.
|
<beginners>
|
Обработка исключений с++ 13.11.05 23:56
Автор: duu Статус: Незарегистрированный пользователь
|
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
try
{
int a;
for (int g=-11; g<11; g++) a=a/g; // деление на ноль
// throw 1;
}
catch(...)
{
printf(" >>> ");
return 0;
}
return 0;
}
Подскажите пожалуйста, как обрабатываются исключения
Должна ли (и почему у меня не выводится если должна / как сделать чтобы выводилась) выводиться строка printf(" >>> ");
|
|
никто не обещал, что c++-исключения обработают деление на ноль 14.11.05 00:11
Автор: dl <Dmitry Leonov> Отредактировано 14.11.05 00:16 Количество правок: 1
|
Это можно перехватить с помощью структурных исключений Win32. Есть вариант и скрестить - см.
_set_se_translator
Если очень на пальцах, то примерно так:
#include <eh.h>
class SE_Exception
{
private:
unsigned int nSE;
public:
SE_Exception() {}
SE_Exception( unsigned int n ) : nSE( n ) {}
~SE_Exception() {}
unsigned int getSeNumber() { return nSE; }
};
inline void trans_func( unsigned int u, EXCEPTION_POINTERS* pExp )
{
throw SE_Exception(u);
}
inline void SetSETranslation()
{
_set_se_translator( trans_func );
}
---
После чего аппаратные исключения будут приводить к c++-исключениям.
|
| |
А в Линуксе как ??? 14.11.05 01:14
Автор: duu Статус: Незарегистрированный пользователь
|
А в Линуксе как (на самом деле у меня в ней проблема с выходом за границы char массива) ?
Я, видимо, ошибаюсь, думая, что исключения вызвает ось при любой нештатной работе приложения. Правильно думать, что в реализации класса должнен быть сделан отлов (проверка) допустимых значений (например) и генерация throw, если "что-то не так" ???
|
| | |
Sigsegv 14.11.05 11:33
Автор: amirul <Serge> Статус: The Elderman
|
> А в Линуксе как (на самом деле у меня в ней проблема с > выходом за границы char массива) ?
SIGSEGV
> Я, видимо, ошибаюсь, думая, что исключения вызвает ось при > любой нештатной работе приложения. Правильно думать, что в
Ось не заточена под C++. У нее есть собственная модель исключений, которую можно использовать в любом языке программирования. В винде это SEH (structured exception handling), в линуксе сигналы. В общем случае C++ исключения и "исключения" операционной системы не пересекаются (в лучшем случае C++ исключения являются надстройкой над ОСевыми, как это сделано например в винде).
> реализации класса должнен быть сделан отлов (проверка) > допустимых значений (например) и генерация throw, если > "что-то не так" ???
Можно не проверять каждый раз диапазоны, а ловить исключения операционной системы и кидать C++ (собственно примерно так и делает _se_translator, который предложил dl)
|
| | | |
1. Что-то во в этом роде я пробовал... 14.11.05 18:30
Автор: duu Статус: Незарегистрированный пользователь
|
1. Что-то во в этом роде я пробовал ...
struct sigaction saUser;
void UserSignal (int signum) { trow; } // здесь в разных комбинациях
memset (&saUser,0,sizeof(saUser));
saUser.sa_handler=&UserSignal;
sigaction (11,&saUser,NULL);
Но как восстановить (продолжить) работу приложения после перехвата 11 (SIGSEGV ) сигнала - у меня оно все время все равно погибает ?
2. Вы случайно отладкой многопотокового приложения не занимались ? Отладкой с помощью gdb ?
|
| | | | |
Здесь 15.11.05 12:15
Автор: amirul <Serge> Статус: The Elderman
|
> 1. Что-то во в этом роде я пробовал ...
> struct sigaction saUser; > void UserSignal (int signum) { trow; } // здесь в разных > комбинациях
> memset (&saUser,0,sizeof(saUser)); > saUser.sa_handler=&UserSignal; > sigaction (11,&saUser,NULL); > > Но как восстановить (продолжить) работу приложения после > перехвата 11 (SIGSEGV ) сигнала - у меня оно все время все > равно погибает ?
Здесь
http://gcc.gnu.org/ml/gcc/1999-01n/msg00342.html
говорят, что лучшее, что можно сделать - это сделать дополнительный поток для кидания exception-ов и засинхронизировать его каким либо образом с потоком обработки сигнала (предлагают поллить, но как по мне, то лучше event-ы)
У меня есть мысль, что можно все сделать на основе setjmp/longjmp, только нужно быть ОЧЕНЬ осторожным с локальными переменными (посмотреть в отладчике правильно ли раскручивается стек после throw-а из кода, в который перешли по longjmp).
> 2. Вы случайно отладкой многопотокового приложения не > занимались ? Отладкой с помощью gdb ?
Многопотокового - было, gdb - нет. Я виндовозник, а под виндой gdb существенно проигрывает микрософтовскому отладчику.
|
| | | | | |
sigsetjmp/siglongjmp вроде дали какой-то результат ... (изучение продолжается ...) 18.11.05 21:40
Автор: duu Статус: Незарегистрированный пользователь
|
> У меня есть мысль, что можно все сделать на основе > setjmp/longjmp, только нужно быть ОЧЕНЬ осторожным с > локальными переменными (посмотреть в отладчике правильно ли > раскручивается стек после throw-а из кода, в который > перешли по longjmp).
sigsetjmp/siglongjmp вроде дали какой-то результат ... (изучение продолжается ...)
Я хотел спросить, может какой-нибудь есть хороший форум по линукс программированию (какие я самостоятельно нашел - вялотекущие какие-то) ?
|
| | |
именно так, throw кто-то должен вызвать 14.11.05 02:24
Автор: dl <Dmitry Leonov>
|
|
|
|