OVH Cloud OVH Cloud

[future évolution ?] bloc else pour les excpetions

36 réponses
Avatar
Benoit Dejean
est-ce qu'il est prévu d'apporter cette fonctionnalité

try
{
// code pouvant lancer une exception
}
catch()
{
// code exécuté si un exception est lancée
}
else
{
// code exécuté si aucune exception n'a été lancée
}


--
Ne perdez pas de vue qu'un programme qui plante est d'une utilité quasi nulle,
ce qui est loin d'être incompatible avec la notion d'Art.

10 réponses

1 2 3 4
Avatar
Benoit Dejean
Le Tue, 08 Jul 2003 07:46:49 +0200, Fabien LE LEZ a écrit :

On Tue, 08 Jul 2003 05:33:33 +0200, Benoit Dejean
wrote:

mais moi j'attends du bloc else, c'est qu'il soit exécuté si
aucune exception n'est lancée: si une exception attendue est survenue ou
si une exception inattendue est survenue (et remontée donc, normal)

je suis pas clair?


Relis ta phrase, et tu t'apercevras que non ;-)

Bon, prenons un exemple :

class A {};
class B {};

enum { NO_THROW, THROW_A, THROW_B };

void f (int action)
{
try
{
switch (action)
{
case 1: throw A();
case 2: throw B();
}
}
catch (A)
{
}
else
{
...
}
}

Dans lesquels des cas suivants le "bloc else" doit-il être exécuté
suivant tes spécifications ?
f(NO_THROW);
f(THROW_A);
f(THROW_B);


NO_THROW

--
"Ne perdez pas de vue qu'un programme rapide et incorrect est d'une utilité presque nulle."
Ce qui est loin d'être incompatible avec la notion d'Art.


Avatar
Julien Blanc
Benoit Dejean wrote:


On Mon, 07 Jul 2003 21:12:13 +0200, Benoit Dejean
wrote:


Objet o;

try
{
o= fonction();
}
catch(exception &e)
{
// traitement d'erreur
// mais qui n'implique pas d'instruction d'arrêt
}
else


Essaie en remplaçant le "else" par
catch (...) { throw; }



ça ne remplace pas du tout. Dans le cas ou l'exception déclenchée est
inattendue, elle remonte, else ou pas else. d'ailleurs il me semble que ce
bloc est le comportement par défaut non? mais je vois ou tu veux en
venir. mais moi j'attends du bloc else, c'est qu'il soit exécuté si
aucune exception n'est lancée: si une exception attendue est survenue ou
si une exception inattendue est survenue (et remontée donc, normal)

je suis pas clair?


en fait, ce qui n'est pas clair, c'est pourquoi la solution qui parait
la plus simple :

try {
/actions/
/actions si pas d'exception/
}
catch() { /récupération/ }

ne te convient pas ?

est-ce parce que ton bloc d'actions si pas d'exception est susceptible
d'en lever une qui pourrait être interceptée par les catch qui suivent ?
Ca me parait douteux conceptuellement.

--
Julien Blanc. Equipe cadp. VERIMAG. Grenoble. France.



Avatar
Benoit Dejean
Le Tue, 08 Jul 2003 14:01:27 +0200, Julien Blanc a écrit :

Benoit Dejean wrote:



en fait, ce qui n'est pas clair, c'est pourquoi la solution qui parait
la plus simple :

try {
/actions/
/actions si pas d'exception/
}
catch() { /récupération/ }

ne te convient pas ?


non, voir mes messages précédents.

est-ce parce que ton bloc d'actions si pas d'exception est susceptible
d'en lever une qui pourrait être interceptée par les catch qui suivent
? Ca me parait douteux conceptuellement.


je n'ai jamais dit le contraire mais la n'est pas le problème. le bloc
else peut lui même contenir des blocs try/catch, etc. je n'ai pas dit que
else devait être un bloc qui ne lève pas d'exception. ça n'a donc rien
de douteux. on est pessimiste, on essaye de capturer des exceptions,
pourquoi ne pas aussi envisager le cas où aucune exception n'est levée?

--
"Ne perdez pas de vue qu'un programme rapide et incorrect est d'une utilité presque nulle."
Ce qui est loin d'être incompatible avec la notion d'Art.

Avatar
Julien Blanc
Benoit Dejean wrote:

est-ce parce que ton bloc d'actions si pas d'exception est susceptible
d'en lever une qui pourrait être interceptée par les catch qui suivent
? Ca me parait douteux conceptuellement.



je n'ai jamais dit le contraire mais la n'est pas le problème. le bloc
else peut lui même contenir des blocs try/catch, etc. je n'ai pas dit que
else devait être un bloc qui ne lève pas d'exception. ça n'a donc rien
de douteux. on est pessimiste, on essaye de capturer des exceptions,
pourquoi ne pas aussi envisager le cas où aucune exception n'est levée?


mais le cas où aucune exception n'est levée, c'est le cas où ton
programme s'exécute convenablement, donc je ne vois pas vraiment
l'intérêt conceptuel d'un traitement spécifique au cas "aucune erreur
n'est intervenue".

s'il n'y a pas d'erreurs, on continue l'exécution normale du programme.
Et s'il y'a erreur, et bien, il faut soit récupérer cette erreur soit
propager l'information.

un try { /instructions/ } catch { /récupération/ } else {
/fin_de_traitement/ }

me parait plus que douteux puisque soit on récupère de manière correcte
dans le catch, et dans ce cas il faut bien finir le traitement, soit on
ne le fait pas et dans ce cas on ne propage pas l'information, ce qui
équivaut à se moquer éperduement de l'erreur. J'ai vraiment du mal à
cerner un cas où ça pourrait être utile (si tu as un exemple concret
assez court...)

Ceci dit, la solution pour arriver à un résultat similaire t'as été
donnée, il faut utiliser soit un branchement return, soit un booléen.

--
Julien Blanc. Equipe cadp. VERIMAG. Grenoble. France.


Avatar
Benoit Dejean
Le Tue, 08 Jul 2003 14:43:21 +0200, Julien Blanc a écrit :

Benoit Dejean wrote:

mais le cas où aucune exception n'est levée, c'est le cas où ton
programme s'exécute convenablement, donc je ne vois pas vraiment
l'intérêt conceptuel d'un traitement spécifique au cas "aucune erreur
n'est intervenue".

s'il n'y a pas d'erreurs, on continue l'exécution normale du programme.
Et s'il y'a erreur, et bien, il faut soit récupérer cette erreur soit
propager l'information.

un try { /instructions/ } catch { /récupération/ } else {
/fin_de_traitement/ }

me parait plus que douteux puisque soit on récupère de manière
correcte dans le catch, et dans ce cas il faut bien finir le traitement,
soit on ne le fait pas et dans ce cas on ne propage pas l'information,
ce qui équivaut à se moquer éperduement de l'erreur. J'ai vraiment du
mal à cerner un cas où ça pourrait être utile (si tu as un exemple
concret assez court...)


j'ai déjà posté un petit morceau, mais c'est assez maladroit en C++

pourtant ça me parait utile de savoir si une erreur s'est produite ou pas

Ceci dit, la solution pour arriver à un résultat similaire t'as été
donnée, il faut utiliser soit un branchement return, soit un booléen.


je continue avec ma floppée de booléens. je vous faisais juste part du
fait que certains langages portent un interet au bloc else.

--
"Ne perdez pas de vue qu'un programme rapide et incorrect est d'une utilité presque nulle."
Ce qui est loin d'être incompatible avec la notion d'Art.

Avatar
Fabien LE LEZ
On Tue, 08 Jul 2003 12:10:37 +0200, Benoit Dejean
wrote:

Le Tue, 08 Jul 2003 07:46:49 +0200, Fabien LE LEZ a écrit :
[snip 50 lignes]
NO_THROW


Oh le goret-quote :-(


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
Fabien LE LEZ
On Tue, 08 Jul 2003 21:23:03 +0200, Benoit Dejean
wrote:

j'ai certes était totemisé chez les Scout comme 'Sanglier' mais je crois
que c'est pas de ça que tu parles...


Non, effectivement. Je parlais du AOL-quote : on cite les 50 lignes
d'un message pour rajouter 3 mots...


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
Benoit Dejean
Le Tue, 08 Jul 2003 22:59:20 +0200, Fabien LE LEZ a écrit :

Non, effectivement. Je parlais du AOL-quote : on cite les 50 lignes d'un
message pour rajouter 3 mots...


j'ai pas fait gaffe...

--
"Ne perdez pas de vue qu'un programme rapide et incorrect est d'une utilité presque nulle."
Ce qui est loin d'être incompatible avec la notion d'Art.

Avatar
drkm
Fabien LE LEZ writes:

On Tue, 08 Jul 2003 12:10:37 +0200, Benoit Dejean
wrote:

Le Tue, 08 Jul 2003 07:46:49 +0200, Fabien LE LEZ a écrit :
[snip 50 lignes]
NO_THROW


Oh le goret-quote :-(


Tu veux dire une quote de porc ?

--drkm


Avatar
Michel Michaud
Dans news:, Benoit
je n'ai pas vraiment de code sous la main, puisque j'évite cette
manière de faire en C++, mais programmant également beaucoup en
python, j'utilise énormément ceci dans mes scripts.

voilà un petit exemple

Objet o;

try
{
o= fonction();
}
catch(exception &e)
{
// traitement d'erreur
// mais qui n'implique pas d'instruction d'arrêt
}
else
{
// AUCUNE exception n'a été déclenchée
// (et non pas aucune exception capturée)
// opérations avec o
// délibérément hors contrôle du try précédent
o.print(); // par exemple
}

mon idée n'est évidemment pas de tout mélanger, juste d'évoquer
cette fonctionnalité. Je n'ai pas l'ambition de dire ce qui est
bien ou pas, mais comme j'utilise souvent cette technique par
ailleurs, je vous en fait par.


Ton « exemple » montre du code qui aurait pu s'écrire plus
simplement sans le else, en mettant le o.print() dans le
try. Encore une fois, si tu as une raison de faire les choses
ainsi, montre un exemple réaliste...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

1 2 3 4