информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыЗа кого нас держат?Портрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
именно так, throw кто-то должен вызвать 14.11.05 02:24  Число просмотров: 2606
Автор: dl <Dmitry Leonov>
<"чистая" ссылка>
<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>
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach