 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Marc G Guest
|
Posted: Sun Nov 05, 2006 3:20 am Post subject: comment intercepter les erreurs dans <math> ? |
|
|
tout est dit dans l'objet ...
sous win32, je peux surcharger la fonction
int _matherr(struct _exception *a)
mais je cherche une solution standard et multi-plateformes...si elle existe
ex : je fais
std::log(-1.0)
comment j'intercepte l'erreur ?
chez moi, ça passe à travers un catch(...)
Marc |
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Sun Nov 05, 2006 10:11 am Post subject: Re: comment intercepter les erreurs dans <math> ? |
|
|
"Marc G" <mgueguen (AT) metrica (DOT) fr> writes:
| Quote: | tout est dit dans l'objet ...
sous win32, je peux surcharger la fonction
int _matherr(struct _exception *a)
mais je cherche une solution standard et multi-plateformes...si elle existe
ex : je fais
std::log(-1.0)
comment j'intercepte l'erreur ?
chez moi, ça passe à travers un catch(...)
|
La norme ne définit pas d'exception pour ces erreurs. En cas d'erreur de
domaine ou d'impossibilité de représenter le résultat, errno est mis à une
valeur non nulle (EDOM ou ERANGE)
errno = 0;
x = log(-1.0);
assert(errno != 0);
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org |
|
| Back to top |
|
 |
Marc G Guest
|
Posted: Sun Nov 05, 2006 4:35 pm Post subject: Re: comment intercepter les erreurs dans <math> ? |
|
|
| Quote: | errno = 0;
x = log(-1.0);
assert(errno != 0);
oui, mais errno, c'est une variable globale win32 |
et assert, ça marche en mode debug...
pour log, c'est facile de vérifier que l'argument passé est >0
mais pour exp par exemple, comment savoir qu'on a dépassé la valeur max
double...
A + et bon week-end !
Marc |
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Sun Nov 05, 2006 5:04 pm Post subject: Re: comment intercepter les erreurs dans <math> ? |
|
|
"Marc G" <mgueguen (AT) metrica (DOT) fr> writes:
| Quote: | errno = 0;
x = log(-1.0);
assert(errno != 0);
oui, mais errno, c'est une variable globale win32
|
Non. errno n'a rien à voir avec win32.
C'est une macro qui s'étends en une lvalue modifiable.
| Quote: | et assert, ça marche en mode debug...
|
Il y a pas mal de gens qui laissent les assertions activées même en mode
release...
Et naturellement, tu fais naturellement le test que tu veux. L'utilisation
de errno était un moyen simple de signifier que log devait mettre dans
errno une valeur non nulle dans ce cas.
| Quote: | pour log, c'est facile de vérifier que l'argument passé est >0
mais pour exp par exemple, comment savoir qu'on a dépassé la valeur max
double...
|
De la même manière.
$ cat testexp.cc
#include <errno.h>
#include <stdio.h>
#include <math.h>
int main()
{
errno = 0;
double x = exp(1.0);
perror("exp");
double y = exp(65536.0);
perror("exp");
}
$ como -o testexp testexp.cc -lm
Comeau C/C++ 4.3.3 (Oct 24 2003 16:00:23) for RedHat_LINUX_INTEL_ELF
Copyright 1988-2003 Comeau Computing. All rights reserved.
MODE:strict errors C++
$ ./testexp
exp: Success
exp: Numerical result out of range
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org |
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Mon Nov 06, 2006 10:11 am Post subject: Re: comment intercepter les erreurs dans <math> ? |
|
|
"Marc G" <mgueguen (AT) metrica (DOT) fr> writes:
| Quote: | errno = 0;
double x = exp(1.0);
perror("exp");
double y = exp(65536.0);
perror("exp");
Sous Win32, j'ai pas trouvé mieux que
FILE *f=freopen("output.err","a+",stderr);
std::ios_base::syn_with_stdio();
errno=0;
double x=std::exp(100000.0);
if (errno!=0) perror("exp");
errno=0;
fclose(f);
mais y-a-t-il un moyen de rediriger le flux vers autre chose qu'un fichier ?
|
Tu as strerror si tu veux le message. Tu en fais ce que tu veux
apres. Tu as aussi une serie de macro ERRxxx avec lesquelles comparer
errno.
A+
--
Jean-Marc |
|
| Back to top |
|
 |
Michel Decima Guest
|
Posted: Mon Nov 06, 2006 10:11 am Post subject: Re: comment intercepter les erreurs dans <math> ? |
|
|
Marc G a écrit :
| Quote: | errno = 0;
double x = exp(1.0);
perror("exp");
double y = exp(65536.0);
perror("exp");
Sous Win32, j'ai pas trouvé mieux que
FILE *f=freopen("output.err","a+",stderr);
std::ios_base::syn_with_stdio();
errno=0;
double x=std::exp(100000.0);
if (errno!=0) perror("exp");
errno=0;
fclose(f);
mais y-a-t-il un moyen de rediriger le flux vers autre chose qu'un fichier ?
|
perror() traduit le code d'erreur contenu dans errno en une
chaine de caractere et l'affiche sur la sortie standard. Tu
peux utiliser la fonction strerror() pour ecrire ta propre
version de perror() qui ecrira ou tu veux:
void qerror(char const* msg)
{
LOG << msg << ": " << strerror(errno);
} |
|
| Back to top |
|
 |
Marc G Guest
|
Posted: Mon Nov 06, 2006 10:11 am Post subject: Re: comment intercepter les erreurs dans <math> ? |
|
|
| Quote: | errno = 0;
double x = exp(1.0);
perror("exp");
double y = exp(65536.0);
perror("exp");
|
Sous Win32, j'ai pas trouvé mieux que
FILE *f=freopen("output.err","a+",stderr);
std::ios_base::syn_with_stdio();
errno=0;
double x=std::exp(100000.0);
if (errno!=0) perror("exp");
errno=0;
fclose(f);
mais y-a-t-il un moyen de rediriger le flux vers autre chose qu'un fichier ?
A +
Marc |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|