Thread View: pl.comp.lang.c
4 messages
4 total messages
Started by Mikolaj Rydzewski
Tue, 20 Jan 1998 10:54
Obsluga wyjatkow?
Author: Mikolaj Rydzewski
Date: Tue, 20 Jan 1998 10:54
Date: Tue, 20 Jan 1998 10:54
30 lines
1525 bytes
1525 bytes
Czesc!
Mam pewien problem zwiazany z obsluga wyjatkow w C++. Chcialem sobie
przechwycic wyjatek dzielenia przez zero i nic z tego nie wyniklo - tzn.
wyniklo, ale przerwanie programu, a nie przechwycenie wyjatku. Jeszcze
gorzej bylo z odwolaniem sie do pustego wskaznika. Testowalem to na c++ pod
Linuxem i SunOS'em oraz na Visual C++ 4.0
try
{ int x, y=0;
x=x/y;
}
catch(...)
{ cout << "catch!" << endl;
}
A moze kod jest zly?
--------------------------------------------------------------------------
Mikolaj Rydzewski Jagiellonian University
e-mail: mrydzews@ii.uj.edu.pl Institute of Computer Science
URL: http://www.ii.uj.edu.pl/~mrydzews/
voice: +48 (12) 6330420
Tip of the day: ( generated by /usr/games/fortune )
God may be subtle, but He isn't plain mean.
-- Albert Einstein
--------------------------------------------------------------------------
Re: Obsluga wyjatkow?
Author: Radoslaw Gancarz
Date: Tue, 20 Jan 1998 14:31
Date: Tue, 20 Jan 1998 14:31
30 lines
1798 bytes
1798 bytes
Mikolaj Rydzewski <mrydzews@infoserv.ii.uj.edu.pl> wrote:
> Czesc!
> Mam pewien problem zwiazany z obsluga wyjatkow w C++. Chcialem sobie
> przechwycic wyjatek dzielenia przez zero i nic z tego nie wyniklo - tzn.
> wyniklo, ale przerwanie programu, a nie przechwycenie wyjatku. Jeszcze
> gorzej bylo z odwolaniem sie do pustego wskaznika. Testowalem to na c++ pod
> Linuxem i SunOS'em oraz na Visual C++ 4.0
> try
> { int x, y=0;
> x=x/y;
> }
> catch(...)
> { cout << "catch!" << endl;
> }
> A moze kod jest zly?
Z wyjatkami jest AFAIK tak ze aby je zlapac trzeba najpierw je zglosic :-).
Biblioteki matematyczne zwykle tego nie robia. Zamiast tego wysylany
jest sygnal ("man signal", pod linuxem rowniez "man 7 signal") SIGFPE -
wyjatek operacji zmiennopozycyjnych, ktory powinienes odpowiednio
obsluzyc (jak to zrobic to juz inny problem). Sygnaly sa chyba w ANSI C,
a na pewno sa w jakiejs normie POSIX.
--
1+-------------------------------------------------------------------------+1
2| Radoslaw Gancarz feanor@zeus.polsl.gliwice.pl |2
3+--------Zeby zadac pytanie, trzeba znac chociaz czesc odpowiedzi.--------+3
Re: Obsluga wyjatkow?
Author: Michal Malecki
Date: Mon, 26 Jan 1998 13:39
Date: Mon, 26 Jan 1998 13:39
47 lines
2837 bytes
2837 bytes
Mikolaj Rydzewski <mrydzews@infoserv.ii.uj.edu.pl> wrote:
: Czesc!
: Mam pewien problem zwiazany z obsluga wyjatkow w C++. Chcialem sobie
: przechwycic wyjatek dzielenia przez zero i nic z tego nie wyniklo - tzn.
: wyniklo, ale przerwanie programu, a nie przechwycenie wyjatku. Jeszcze
: gorzej bylo z odwolaniem sie do pustego wskaznika. Testowalem to na c++ pod
: Linuxem i SunOS'em oraz na Visual C++ 4.0
: try
: { int x, y=0;
: x=x/y;
: }
: catch(...)
: { cout << "catch!" << endl;
: }
: A moze kod jest zly?
Alez wlasnie od tego kod musi byc zly, zeby wyjatek sie przechwycil :-).
Niestety, to trzeba stwierdzic, ze wyjatki sa na tyle nowym mechanizmem, ze
nie posiadaja jeszcze ani stdandaryzacji, ani implementacji. Oznacza to,
ze albo sam sobie porzucasz wyjatkami, albo lapal bedziesz najwyzej motyle.
Jezeli chodzi o standartowe rzeczy, to wyjasniam - przylaczajac sie do
wypowiedzi mojego poprzednika - ze standartowo pod UNIX'em mamy do dyspozycji
jedynie sygnaly. Po odwolaniu sie do pustego wskaznika zglosi sie SIGSEGV.
Przy dzieleniu przez zero - SIGFPE (co prawda nazwa sugeruje Floating-Point,
ale jest zglaszany przy wszelkich bledach matematycznych). Oczywiscie jest to
jedyny sygnal zglaszany przy operacjach na liczbach calkowitych (przepelnienia
i przeniesienia sa ignorowane).
Jest sporo mechanizmow do obslugiwania sygnalow. Oczywiscie wyjatki maja duza
przewage, przede wszystkim dlatego, ze mozna w nich zawrzec pewne informacje,
a takze, ze ulegaja propagacji. Niestety nie sa jak na razie stosowane przez
standartowe biblioteki. Dla mnie byloby duzym ustepstwem, gdyby zamiast SIGSEGV
zglaszal sie odpowiedni wyjatek (z odpowiednia informacja, ktora moglbym
zrzucic do core'a). Niestety, na to bedziemy musieli poczekac.
Za slowami kolegi, polecam:
1. man -a signal // informacje o funkcjach
2. cat /usr/include/sys/signal.h // rodzaje sygnalow
--
.---. . . - Michal Malecki <mmalecki@technologist.com>/The things that
\___ ,-. | , |- ,-. ,- mUd: zly.mud.org.pl 4000. /can't destroy you
\ |-' |< | | | | uRl: www.kis.p.lodz.pl/~sektor /make you
`---' `-' ' ` `' `-' ' pGp: sektor@zly.kis.p.lodz.pl /stronger...
Re: Obsluga wyjatkow?
Author: Marek Barbaszynski
Date: Mon, 26 Jan 1998 15:03
Date: Mon, 26 Jan 1998 15:03
71 lines
2172 bytes
2172 bytes
Mikolaj Rydzewski <mrydzews@infoserv.ii.uj.edu.pl> wrote:
> : Czesc!
>
> : Mam pewien problem zwiazany z obsluga wyjatkow w C++. Chcialem sobie
> : przechwycic wyjatek dzielenia przez zero i nic z tego nie wyniklo - tzn.
> : wyniklo, ale przerwanie programu, a nie przechwycenie wyjatku. Jeszcze
> : gorzej bylo z odwolaniem sie do pustego wskaznika. Testowalem to na c++ pod
> : Linuxem i SunOS'em oraz na Visual C++ 4.0
>
> : try
> : { int x, y=0;
> : x=x/y;
> : }
> : catch(...)
> : { cout << "catch!" << endl;
> : }
[Ciach!]
Dla Visual C++ polecam zastosowanie funkcji _set_se_translator, ktora
pozwala na zadanie wlasnego tlumaczenia wyjatkow systemowych na wyjatki
C++. Oto maly przyklad:
/* SETRANS.CPP
*/
#include <stdio.h>
#include <windows.h>
#include <eh.h>
void SEFunc();
void trans_func( unsigned int, EXCEPTION_POINTERS* );
class SE_Exception
{
private:
unsigned int nSE;
public:
SE_Exception() {}
SE_Exception( unsigned int n ) : nSE( n ) {}
~SE_Exception() {}
unsigned int getSeNumber() { return nSE; }
};
void main( void )
{
try
{
_set_se_translator( trans_func );
SEFunc();
}
catch( SE_Exception e )
{
printf( "Caught a __try exception with SE_Exception.\n" );
}
}
void SEFunc()
{
__try
{
int x, y=0;
x = 5 / y;
}
__finally
{
printf( "In finally\n" );
}
}
void trans_func( unsigned int u, EXCEPTION_POINTERS* pExp )
{
printf( "In trans_func.\n" );
throw SE_Exception();
}
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads