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
А в Линуксе как (на самом деле у меня в ней проблема с выходом за границы char массива) ?
Я, видимо, ошибаюсь, думая, что исключения вызвает ось при любой нештатной работе приложения. Правильно думать, что в реализации класса должнен быть сделан отлов (проверка) допустимых значений (например) и генерация throw, если "что-то не так" ???
Sigsegv14.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 Статус: Незарегистрированный пользователь
> struct sigaction saUser; > void UserSignal (int signum) { trow; } // здесь в разных > комбинациях
> memset (&saUser,0,sizeof(saUser)); > saUser.sa_handler=&UserSignal; > sigaction (11,&saUser,NULL); > > Но как восстановить (продолжить) работу приложения после > перехвата 11 (SIGSEGV ) сигнала - у меня оно все время все > равно погибает ?
говорят, что лучшее, что можно сделать - это сделать дополнительный поток для кидания 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>