Newsgroup: it.comp.lang.c++
Titolo: Eccezioni sotto linux

Ciao a tutto il NG!
mi chiamo Roberto ed e' la prima volta che posto su questo newsgroup. Non so se il seguente quesito e' OT o meno...
Lavoro su un sistema linux red hat 7.0 con il compilatore gcc 2.96 e ho scritto qualcosa di equivalente a questo:
int main ( int argc, char ** argv )
{
	try {
		int zero = 0;
		int result = 8 / zero;
	}
	catch ( ... ) {
		std::cout << "eccezione catturata" << std::endl;
	}
	return 0;
}
sotto Windows l'eccezione veniva catturata tranquillamente, mentre sotto linux il programma "muore" generando il file core e il 
segnale SIGFPE (floating point exception). E' possibile fargli lanciare un'eccezione? E come?
Grazie in anticipo per le risposte!
gianax

 segnale SIGFPE (floating point exception). E' possibile fargli lanciare
un'eccezione? E come?
Purtroppo lo standard C++ non specifica che un compilatore
aderente allo standard debba garantire diagnosi "morbida"
(via exception) di errori come la divisione per zero.  Lo
standard recita invece, ahime`, a 5.6.2 (traduco):
"""
Se il secondo operando di / o % e` zero il
comportamento e` undefined.
"""
E` dunque standard su questo punto sia Microsoft Visual C++
(che lancia un'eccezione a fronte di errori come questo, il
che e` sicuramente il comportamento piu` utile dal punto di
vista del programmatore:-), sia gcc, che (sia colpa sua o
del SO su cui gira) solleva un segnale di tipo C (quindi senza
nessuna delle comodita` delle exception C++) su di un mitico
errore "floating point" (?!).  "undefined" e` un termine molto
forte: a rigor di standard, sarebbe OK anche un compilatore
che, se scopre una divisione per zero, ti riformatta il disco
fisso, e/o spedisce un'email alla tua ragazza rivelandole
cosa hai fatto l'altra sera con la migliore amica di lei:-).
Purtroppo, nella stesura dello standard C++, si e` deciso
(e forse era l'unica) di permettere il supporto come "standard"
anche di hardware, sistemi operativi, compilatori, e librerie
di runtime non certo soddisfacenti da tanti punti di vista.
Chi vuole scrivere codice C++ portatile deve dunque (almeno
sino al prossimo release dello standard) smazzarsi lui tutte
le peculiarita` (teoricamente "standard":-) dei vari compilatori
(oltre alle deviazioni di dati compilatori dallo standard, siano
documentate oppure no [aka BUG:-)]).
Alex (MVP di Brainbench per il C++)

 """
WOW! Ho chiesto un consiglio e ho avuto una consulenza!!! 8-)
Grazie lo stesso mi arrangero' in qualche modo... d'altra parte devo pur far qualcosa la notte...

"Roberto Gianassi" <gia...@NOSPAMyahoo.it> ha scritto nel messaggio
news:1104_990447878@roby...

Prova con qualcosa del genere:
#include <csignal>
#include <stdexcept>
#include <iostream>
void handler(int)
{
   std::signal(SIGFPE, handler);  //  reinstall signal handler
   throw std::runtime_error("floating point error");
}
int main()
{
   std::signal(SIGFPE, handler);  // install signal handler
   try
   {
     float zero = 0.;
     float result = 8. / zero;
   }
   catch( ... )
   {
     std::cout << "eccezione catturata" << std::endl;
   }
}
Nota che al posto degli interi ho usato i float perchč
SIGFPE č un segnale per un "floating point error"
Saluti Manlio Perillo

Quale compilatore per c++ sotto Linux ?
Ciao
Alessandro

 Quale compilatore per c++ sotto Linux ?
g++ (gcc).
Bye,
 Emmanuele.
-- 
Emmanuele Bassi         |             [ 
http://digilander.iol.it/ebassi/
 ]
emmanue...@iol.it
  |
GnuPG Key fingerprint = 4DD0 C90D 4070 F071 5738  08BD 8ECC DB8F A432 0FF4