OVH Cloud OVH Cloud

comment intercepter les erreurs dans ?

4 réponses
Avatar
Marc G
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

4 réponses

Avatar
Jean-Marc Bourguet
"Marc G" writes:

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

Avatar
Marc G
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

Avatar
Jean-Marc Bourguet
"Marc G" writes:

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.

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.

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


Avatar
Jean-Marc Bourguet
"Marc G" writes:

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