En plus des aspects purement conception, il faut bien tenir
compte des contraints techniques. Si on ne peut pas se servir
d'un code de retour, et qu'on ne veut pas avorter le programme,
une exception est en général préferrable aux alternatifs, tels
qu'ignorer l'erreur, ou positionner une variable globale à la
errno. Dans le cas des constructeurs, elle convient
particulièrement, parce que grace à l'exception, il n'y a pas
l'objet ; sans l'exception, il faut traiter la possibilité d'un
objet invalid.
En plus des aspects purement conception, il faut bien tenir
compte des contraints techniques. Si on ne peut pas se servir
d'un code de retour, et qu'on ne veut pas avorter le programme,
une exception est en général préferrable aux alternatifs, tels
qu'ignorer l'erreur, ou positionner une variable globale à la
errno. Dans le cas des constructeurs, elle convient
particulièrement, parce que grace à l'exception, il n'y a pas
l'objet ; sans l'exception, il faut traiter la possibilité d'un
objet invalid.
En plus des aspects purement conception, il faut bien tenir
compte des contraints techniques. Si on ne peut pas se servir
d'un code de retour, et qu'on ne veut pas avorter le programme,
une exception est en général préferrable aux alternatifs, tels
qu'ignorer l'erreur, ou positionner une variable globale à la
errno. Dans le cas des constructeurs, elle convient
particulièrement, parce que grace à l'exception, il n'y a pas
l'objet ; sans l'exception, il faut traiter la possibilité d'un
objet invalid.
A ce sujet une question sur le comportement de CodeGuard, une extension de
C++ Builder qui permet de tracker les fuites mémoires...
Quand je construis un objet avec new et qu'une exception est lancée dans le
constructeur, à la sortie du programme, CodeGuard m'indique une fuite mémoire
parce que l'objet en question n'a pas été détruit.
Je crois bien me souvenir qu'il n'est pas besoin de faire un delete dans ce
cas.
A ce sujet une question sur le comportement de CodeGuard, une extension de
C++ Builder qui permet de tracker les fuites mémoires...
Quand je construis un objet avec new et qu'une exception est lancée dans le
constructeur, à la sortie du programme, CodeGuard m'indique une fuite mémoire
parce que l'objet en question n'a pas été détruit.
Je crois bien me souvenir qu'il n'est pas besoin de faire un delete dans ce
cas.
A ce sujet une question sur le comportement de CodeGuard, une extension de
C++ Builder qui permet de tracker les fuites mémoires...
Quand je construis un objet avec new et qu'une exception est lancée dans le
constructeur, à la sortie du programme, CodeGuard m'indique une fuite mémoire
parce que l'objet en question n'a pas été détruit.
Je crois bien me souvenir qu'il n'est pas besoin de faire un delete dans ce
cas.
On Wed, 16 Aug 2006 22:28:57 +0100, Pierre Barbier de Reuille
:Non, le assert définit dans assert.h ou cassert par la norme spécifie
bien que si la macro NDEBUG n'est pas définit au moment de l'inclusion
du fichier d'entête, alors la macro ne fait rien.
OK jusque-là.
Note que si je ne m'abuse, on peut #inclure assert.h plusieurs fois
dans le même .cpp, avec des valeurs différentes. Ce qui permet
d'avoir, via des options de compilation, un contrôle assez fin sur les
erreurs qui arrêteront le programme.Or, NDEBUG est la
macro qui est définit pour indiquer une compilation en mode debug.
C'est quoi le "mode debug" ?
On Wed, 16 Aug 2006 22:28:57 +0100, Pierre Barbier de Reuille
<p.barbierdereuille@free.fr>:
Non, le assert définit dans assert.h ou cassert par la norme spécifie
bien que si la macro NDEBUG n'est pas définit au moment de l'inclusion
du fichier d'entête, alors la macro ne fait rien.
OK jusque-là.
Note que si je ne m'abuse, on peut #inclure assert.h plusieurs fois
dans le même .cpp, avec des valeurs différentes. Ce qui permet
d'avoir, via des options de compilation, un contrôle assez fin sur les
erreurs qui arrêteront le programme.
Or, NDEBUG est la
macro qui est définit pour indiquer une compilation en mode debug.
C'est quoi le "mode debug" ?
On Wed, 16 Aug 2006 22:28:57 +0100, Pierre Barbier de Reuille
:Non, le assert définit dans assert.h ou cassert par la norme spécifie
bien que si la macro NDEBUG n'est pas définit au moment de l'inclusion
du fichier d'entête, alors la macro ne fait rien.
OK jusque-là.
Note que si je ne m'abuse, on peut #inclure assert.h plusieurs fois
dans le même .cpp, avec des valeurs différentes. Ce qui permet
d'avoir, via des options de compilation, un contrôle assez fin sur les
erreurs qui arrêteront le programme.Or, NDEBUG est la
macro qui est définit pour indiquer une compilation en mode debug.
C'est quoi le "mode debug" ?
kanze wrote:Pierre Barbier de Reuille wrote:Michael wrote:Pierre Barbier de Reuille wrote
in news:44e2590c $0$18265$:Pour la hi?rarchie, je ferais trois classes abstraites
d?rivant directement de std::exception, une par type
d'exception, de fa?on ? permettre ? l'utilisateur de ta
lib (i.e. le programmeur) d'intercepter l'exceptions
pertinente o? il le veut (par exemple g?rer les exceptions
utilisateur de mani?re centralis?e pour avoir un affichage,
les exceptions qui lui sont destin?es aux endroits o? il
pourra y faire qqch, et les exceptions graves pourront
?ventuellement donner lieu ? un traitement entrainant la
fermeture du programme ...).
Donc le mieux c'est que tout type d'erreur passe par une
exception, puisque par exemple si dans la lib il est
impossible de créer un objet qui doit être utilisé, il est
inutile d'aller plus loin. Et autant avertir tout le monde
de ce qui a foiré.
Quant aux assert, je les utiliserai pour vérifier que les
paramètres entrés par l'utilisateur de la lib sont
corrects...
Voilà, pour moi la distinction est:
- Exception : erreur d'utilisation ou matérielle
- Assert : pour vérifier que *je* ne me suis pas trompé quelque part,
de toute façon ce sera supprimé dans la version finale (sans avoir rien
à faire, l'entête <cassert> définit la macro assert comme une fo nction
vide si la compilation n'est pas en debug ...)
Je vois trois catégories :
-- Code de rétour : erreur « attendue », donc, non
exceptionnelle. L'exemple type, c'est toute erreur dans les
entrées d'une utilisateur. (Utilisateur, ici, c'est le
bonhomme devant le clavier ; pour le code qui t'appelle, je
parlerais de client.) Pour la reste, c'est souvent une
question de jugement : d'une part, une connexion TCP qui
tombe, il faut s'y attendre de temps en temps, mais de
l'autre, si tu es sur un reseau local, et même en général
sur l'internet, c'est quand même assez exceptionnel.
En gros, je dirais que s'il y a des chances de pouvoir
continuer l'opération en cours, c'est le code de rétour qui
s'impose. (Donc, par exemple, on peut toujours démander que
l'utilisateur rentrer les informations erronées de nouveau,
sans avorter la session.)
Je dois dire que je ne suis pas d'accord (même si, comme tu le
dis plus loin, c'est une affaire de jugement). Mais je ne
pense pas qu'il soit bon de mélanger code de retour et
exceptions.
Un des objectif des exceptions est de ne gérer les erreurs
qu'à l'endroit où tu peux y faire quelque chose ...
alors qu'avec les codes de retour, il faut propager les
erreurs à la main jusqu'à l'endroit qui peut gérer les
erreurs.
Et, typiquement, les erreurs de saisies nécessiteront une
re-saisie des données et l'erreur sera donc gérées au mieux au
niveau de l'interface graphique (pour pouvoir redemander la
saisie).
Si tu utilises un code de retour pour ça, ce sera très lourd à
gérer.
Pour moi, le seul cas où un code de retour est utilisable dans
un système utilisant les exceptions, est s'il est acceptable
d'avoir une erreur "silencieuse".
Par exemple, dans le cas d'un overflow numérique, le fait
d'avoir NaN ou inf à la place d'un nombre valide peut se
justifier, car il est probable que le client remplace ces
valeurs par autre chose par la suite ... mais c'est un des
rares exemples que je vois comme ça.
De plus, je ne vois vraiment pas en quoi le code de retour
permet, plus que les exceptions, de récupérer l'exécution (ni
plus ni moins d'ailleurs ...).
Il faut aussi savoir que la gestion de code de retour est
coûteuse en temps de calcul tout le temps alors que la gestion
des exceptions ne coûte que quand une exception est levée ...
-- Assert (avec avortement en cas d'erreur) : tout ce qui
relève de l'erreur logiciel (y compris dans le code client)
ou d'une panne matérielle qui empêcherait au programme de
fonctionner.
Je suis d'accord pour l'erreur logiciel mais pas pour l'erreur
matérielle ! Lors d'une erreur matériel, une exception est
appropriée, quitte à simplement avertir l'utilisateur et
quitter ...
Le problème de la gestion d'une panne matérielle
avec un assert et qu'il n'y aura plus aucune erreur de gérées
dès que le code est mis en production (i.e. donc plus en
debug).
kanze wrote:
Pierre Barbier de Reuille wrote:
Michael wrote:
Pierre Barbier de Reuille <p.barbierdereuille@free.fr> wrote
in news:44e2590c $0$18265$636a55ce@news.free.fr:
Pour la hi?rarchie, je ferais trois classes abstraites
d?rivant directement de std::exception, une par type
d'exception, de fa?on ? permettre ? l'utilisateur de ta
lib (i.e. le programmeur) d'intercepter l'exceptions
pertinente o? il le veut (par exemple g?rer les exceptions
utilisateur de mani?re centralis?e pour avoir un affichage,
les exceptions qui lui sont destin?es aux endroits o? il
pourra y faire qqch, et les exceptions graves pourront
?ventuellement donner lieu ? un traitement entrainant la
fermeture du programme ...).
Donc le mieux c'est que tout type d'erreur passe par une
exception, puisque par exemple si dans la lib il est
impossible de créer un objet qui doit être utilisé, il est
inutile d'aller plus loin. Et autant avertir tout le monde
de ce qui a foiré.
Quant aux assert, je les utiliserai pour vérifier que les
paramètres entrés par l'utilisateur de la lib sont
corrects...
Voilà, pour moi la distinction est:
- Exception : erreur d'utilisation ou matérielle
- Assert : pour vérifier que *je* ne me suis pas trompé quelque part,
de toute façon ce sera supprimé dans la version finale (sans avoir rien
à faire, l'entête <cassert> définit la macro assert comme une fo nction
vide si la compilation n'est pas en debug ...)
Je vois trois catégories :
-- Code de rétour : erreur « attendue », donc, non
exceptionnelle. L'exemple type, c'est toute erreur dans les
entrées d'une utilisateur. (Utilisateur, ici, c'est le
bonhomme devant le clavier ; pour le code qui t'appelle, je
parlerais de client.) Pour la reste, c'est souvent une
question de jugement : d'une part, une connexion TCP qui
tombe, il faut s'y attendre de temps en temps, mais de
l'autre, si tu es sur un reseau local, et même en général
sur l'internet, c'est quand même assez exceptionnel.
En gros, je dirais que s'il y a des chances de pouvoir
continuer l'opération en cours, c'est le code de rétour qui
s'impose. (Donc, par exemple, on peut toujours démander que
l'utilisateur rentrer les informations erronées de nouveau,
sans avorter la session.)
Je dois dire que je ne suis pas d'accord (même si, comme tu le
dis plus loin, c'est une affaire de jugement). Mais je ne
pense pas qu'il soit bon de mélanger code de retour et
exceptions.
Un des objectif des exceptions est de ne gérer les erreurs
qu'à l'endroit où tu peux y faire quelque chose ...
alors qu'avec les codes de retour, il faut propager les
erreurs à la main jusqu'à l'endroit qui peut gérer les
erreurs.
Et, typiquement, les erreurs de saisies nécessiteront une
re-saisie des données et l'erreur sera donc gérées au mieux au
niveau de l'interface graphique (pour pouvoir redemander la
saisie).
Si tu utilises un code de retour pour ça, ce sera très lourd à
gérer.
Pour moi, le seul cas où un code de retour est utilisable dans
un système utilisant les exceptions, est s'il est acceptable
d'avoir une erreur "silencieuse".
Par exemple, dans le cas d'un overflow numérique, le fait
d'avoir NaN ou inf à la place d'un nombre valide peut se
justifier, car il est probable que le client remplace ces
valeurs par autre chose par la suite ... mais c'est un des
rares exemples que je vois comme ça.
De plus, je ne vois vraiment pas en quoi le code de retour
permet, plus que les exceptions, de récupérer l'exécution (ni
plus ni moins d'ailleurs ...).
Il faut aussi savoir que la gestion de code de retour est
coûteuse en temps de calcul tout le temps alors que la gestion
des exceptions ne coûte que quand une exception est levée ...
-- Assert (avec avortement en cas d'erreur) : tout ce qui
relève de l'erreur logiciel (y compris dans le code client)
ou d'une panne matérielle qui empêcherait au programme de
fonctionner.
Je suis d'accord pour l'erreur logiciel mais pas pour l'erreur
matérielle ! Lors d'une erreur matériel, une exception est
appropriée, quitte à simplement avertir l'utilisateur et
quitter ...
Le problème de la gestion d'une panne matérielle
avec un assert et qu'il n'y aura plus aucune erreur de gérées
dès que le code est mis en production (i.e. donc plus en
debug).
kanze wrote:Pierre Barbier de Reuille wrote:Michael wrote:Pierre Barbier de Reuille wrote
in news:44e2590c $0$18265$:Pour la hi?rarchie, je ferais trois classes abstraites
d?rivant directement de std::exception, une par type
d'exception, de fa?on ? permettre ? l'utilisateur de ta
lib (i.e. le programmeur) d'intercepter l'exceptions
pertinente o? il le veut (par exemple g?rer les exceptions
utilisateur de mani?re centralis?e pour avoir un affichage,
les exceptions qui lui sont destin?es aux endroits o? il
pourra y faire qqch, et les exceptions graves pourront
?ventuellement donner lieu ? un traitement entrainant la
fermeture du programme ...).
Donc le mieux c'est que tout type d'erreur passe par une
exception, puisque par exemple si dans la lib il est
impossible de créer un objet qui doit être utilisé, il est
inutile d'aller plus loin. Et autant avertir tout le monde
de ce qui a foiré.
Quant aux assert, je les utiliserai pour vérifier que les
paramètres entrés par l'utilisateur de la lib sont
corrects...
Voilà, pour moi la distinction est:
- Exception : erreur d'utilisation ou matérielle
- Assert : pour vérifier que *je* ne me suis pas trompé quelque part,
de toute façon ce sera supprimé dans la version finale (sans avoir rien
à faire, l'entête <cassert> définit la macro assert comme une fo nction
vide si la compilation n'est pas en debug ...)
Je vois trois catégories :
-- Code de rétour : erreur « attendue », donc, non
exceptionnelle. L'exemple type, c'est toute erreur dans les
entrées d'une utilisateur. (Utilisateur, ici, c'est le
bonhomme devant le clavier ; pour le code qui t'appelle, je
parlerais de client.) Pour la reste, c'est souvent une
question de jugement : d'une part, une connexion TCP qui
tombe, il faut s'y attendre de temps en temps, mais de
l'autre, si tu es sur un reseau local, et même en général
sur l'internet, c'est quand même assez exceptionnel.
En gros, je dirais que s'il y a des chances de pouvoir
continuer l'opération en cours, c'est le code de rétour qui
s'impose. (Donc, par exemple, on peut toujours démander que
l'utilisateur rentrer les informations erronées de nouveau,
sans avorter la session.)
Je dois dire que je ne suis pas d'accord (même si, comme tu le
dis plus loin, c'est une affaire de jugement). Mais je ne
pense pas qu'il soit bon de mélanger code de retour et
exceptions.
Un des objectif des exceptions est de ne gérer les erreurs
qu'à l'endroit où tu peux y faire quelque chose ...
alors qu'avec les codes de retour, il faut propager les
erreurs à la main jusqu'à l'endroit qui peut gérer les
erreurs.
Et, typiquement, les erreurs de saisies nécessiteront une
re-saisie des données et l'erreur sera donc gérées au mieux au
niveau de l'interface graphique (pour pouvoir redemander la
saisie).
Si tu utilises un code de retour pour ça, ce sera très lourd à
gérer.
Pour moi, le seul cas où un code de retour est utilisable dans
un système utilisant les exceptions, est s'il est acceptable
d'avoir une erreur "silencieuse".
Par exemple, dans le cas d'un overflow numérique, le fait
d'avoir NaN ou inf à la place d'un nombre valide peut se
justifier, car il est probable que le client remplace ces
valeurs par autre chose par la suite ... mais c'est un des
rares exemples que je vois comme ça.
De plus, je ne vois vraiment pas en quoi le code de retour
permet, plus que les exceptions, de récupérer l'exécution (ni
plus ni moins d'ailleurs ...).
Il faut aussi savoir que la gestion de code de retour est
coûteuse en temps de calcul tout le temps alors que la gestion
des exceptions ne coûte que quand une exception est levée ...
-- Assert (avec avortement en cas d'erreur) : tout ce qui
relève de l'erreur logiciel (y compris dans le code client)
ou d'une panne matérielle qui empêcherait au programme de
fonctionner.
Je suis d'accord pour l'erreur logiciel mais pas pour l'erreur
matérielle ! Lors d'une erreur matériel, une exception est
appropriée, quitte à simplement avertir l'utilisateur et
quitter ...
Le problème de la gestion d'une panne matérielle
avec un assert et qu'il n'y aura plus aucune erreur de gérées
dès que le code est mis en production (i.e. donc plus en
debug).
Si je comprend bien la question, C++Builder a raison.
C'est à toi de détruire l'objet par delete.
La façon de faire lorsque tu crains qu'une exception soit levée dans ton
constructeur est de mettre le code dans un bloc try/catch. Lorsque tu
captures l'exception tu effaces l'objet, puis tu relances l'exception.
try
{
// du code
objet* = new.....
// du code qui lève une exception
}
catch(...)
{
delete objet;
throw;
}
Si je comprend bien la question, C++Builder a raison.
C'est à toi de détruire l'objet par delete.
La façon de faire lorsque tu crains qu'une exception soit levée dans ton
constructeur est de mettre le code dans un bloc try/catch. Lorsque tu
captures l'exception tu effaces l'objet, puis tu relances l'exception.
try
{
// du code
objet* = new.....
// du code qui lève une exception
}
catch(...)
{
delete objet;
throw;
}
Si je comprend bien la question, C++Builder a raison.
C'est à toi de détruire l'objet par delete.
La façon de faire lorsque tu crains qu'une exception soit levée dans ton
constructeur est de mettre le code dans un bloc try/catch. Lorsque tu
captures l'exception tu effaces l'objet, puis tu relances l'exception.
try
{
// du code
objet* = new.....
// du code qui lève une exception
}
catch(...)
{
delete objet;
throw;
}
Michel Decima wrote:Je suis d'accord pour l'erreur logiciel mais pas pour
l'erreur matérielle ! Lors d'une erreur matériel, une
exception est appropriée, quitte à simplement avertir
l'utilisateur et quitter ... Le problème de la gestion
d'une panne matérielle avec un assert et qu'il n'y aura
plus aucune erreur de gérées dès que le code est mis en
production (i.e. donc plus en debug).
Qu'est ce qui empeche de garder les assert en production ?
Le fait que la fonction assert est redéfinit en fonction vide
dès que le programme n'est plus compilé en debug ... (ce qui
en dit long sur l'usage prévu pour les assert)
Michel Decima wrote:
Je suis d'accord pour l'erreur logiciel mais pas pour
l'erreur matérielle ! Lors d'une erreur matériel, une
exception est appropriée, quitte à simplement avertir
l'utilisateur et quitter ... Le problème de la gestion
d'une panne matérielle avec un assert et qu'il n'y aura
plus aucune erreur de gérées dès que le code est mis en
production (i.e. donc plus en debug).
Qu'est ce qui empeche de garder les assert en production ?
Le fait que la fonction assert est redéfinit en fonction vide
dès que le programme n'est plus compilé en debug ... (ce qui
en dit long sur l'usage prévu pour les assert)
Michel Decima wrote:Je suis d'accord pour l'erreur logiciel mais pas pour
l'erreur matérielle ! Lors d'une erreur matériel, une
exception est appropriée, quitte à simplement avertir
l'utilisateur et quitter ... Le problème de la gestion
d'une panne matérielle avec un assert et qu'il n'y aura
plus aucune erreur de gérées dès que le code est mis en
production (i.e. donc plus en debug).
Qu'est ce qui empeche de garder les assert en production ?
Le fait que la fonction assert est redéfinit en fonction vide
dès que le programme n'est plus compilé en debug ... (ce qui
en dit long sur l'usage prévu pour les assert)
Même si on s'attend quand même à trouver NDEBUG là où il n'y a
pas de compilation en "mode debug" :)
Même si on s'attend quand même à trouver NDEBUG là où il n'y a
pas de compilation en "mode debug" :)
Même si on s'attend quand même à trouver NDEBUG là où il n'y a
pas de compilation en "mode debug" :)
Le problème est que j'utilise intensivement boost::scoped_ptr
pour gérer tout
ça bien comme il faut, et je ne peux pas intervenir sur la destruction de
l'objet...
Le problème est que j'utilise intensivement boost::scoped_ptr
pour gérer tout
ça bien comme il faut, et je ne peux pas intervenir sur la destruction de
l'objet...
Le problème est que j'utilise intensivement boost::scoped_ptr
pour gérer tout
ça bien comme il faut, et je ne peux pas intervenir sur la destruction de
l'objet...
A ce sujet une question sur le comportement de CodeGuard, une
extension de C++ Builder qui permet de tracker les fuites mémoires...
Quand je construis un objet avec new et qu'une exception est lancée
dans le constructeur, à la sortie du programme, CodeGuard m'indique
une fuite mémoire parce que l'objet en question n'a pas été détruit.
Je crois bien me souvenir qu'il n'est pas besoin de faire un delete
dans ce cas.
Si je comprend bien la question, C++Builder a raison.
C'est à toi de détruire l'objet par delete.
La façon de faire lorsque tu crains qu'une exception soit levée dans ton
constructeur est de mettre le code dans un bloc try/catch. Lorsque tu
captures l'exception tu effaces l'objet, puis tu relances l'exception.
try
{
// du code
objet* = new.....
// du code qui lève une exception
}
catch(...)
{
delete objet;
throw;
}
A ce sujet une question sur le comportement de CodeGuard, une
extension de C++ Builder qui permet de tracker les fuites mémoires...
Quand je construis un objet avec new et qu'une exception est lancée
dans le constructeur, à la sortie du programme, CodeGuard m'indique
une fuite mémoire parce que l'objet en question n'a pas été détruit.
Je crois bien me souvenir qu'il n'est pas besoin de faire un delete
dans ce cas.
Si je comprend bien la question, C++Builder a raison.
C'est à toi de détruire l'objet par delete.
La façon de faire lorsque tu crains qu'une exception soit levée dans ton
constructeur est de mettre le code dans un bloc try/catch. Lorsque tu
captures l'exception tu effaces l'objet, puis tu relances l'exception.
try
{
// du code
objet* = new.....
// du code qui lève une exception
}
catch(...)
{
delete objet;
throw;
}
A ce sujet une question sur le comportement de CodeGuard, une
extension de C++ Builder qui permet de tracker les fuites mémoires...
Quand je construis un objet avec new et qu'une exception est lancée
dans le constructeur, à la sortie du programme, CodeGuard m'indique
une fuite mémoire parce que l'objet en question n'a pas été détruit.
Je crois bien me souvenir qu'il n'est pas besoin de faire un delete
dans ce cas.
Si je comprend bien la question, C++Builder a raison.
C'est à toi de détruire l'objet par delete.
La façon de faire lorsque tu crains qu'une exception soit levée dans ton
constructeur est de mettre le code dans un bloc try/catch. Lorsque tu
captures l'exception tu effaces l'objet, puis tu relances l'exception.
try
{
// du code
objet* = new.....
// du code qui lève une exception
}
catch(...)
{
delete objet;
throw;
}
En aucun cas. Le formattage appartient à l'application, ou
éventuellement (pour certains messages) au sous-système de
logging.
C'est bien ce que je craignais...
Est-ce que tu pourrais me donner un exemple de comment les
choses doivent être faites stp? Parce que je ne vois pas
comment faire...
Est-ce à moi de proposer au sein de ma lib de quoi interpréter
les exceptions lancées?
Par exemple une fonction virtuelle retournant un entier pour
chaque type d'exception, avec à côté une doc expliquant à
quelle erreur correspond chaque valeur? Et le client encadre
tous les appels aux fonctions de ma lib avec un try { }
catch(const DShow::Exception & e) {} et récupère cette valeur
et formatte un texte en conséquence?
En aucun cas. Le formattage appartient à l'application, ou
éventuellement (pour certains messages) au sous-système de
logging.
C'est bien ce que je craignais...
Est-ce que tu pourrais me donner un exemple de comment les
choses doivent être faites stp? Parce que je ne vois pas
comment faire...
Est-ce à moi de proposer au sein de ma lib de quoi interpréter
les exceptions lancées?
Par exemple une fonction virtuelle retournant un entier pour
chaque type d'exception, avec à côté une doc expliquant à
quelle erreur correspond chaque valeur? Et le client encadre
tous les appels aux fonctions de ma lib avec un try { }
catch(const DShow::Exception & e) {} et récupère cette valeur
et formatte un texte en conséquence?
En aucun cas. Le formattage appartient à l'application, ou
éventuellement (pour certains messages) au sous-système de
logging.
C'est bien ce que je craignais...
Est-ce que tu pourrais me donner un exemple de comment les
choses doivent être faites stp? Parce que je ne vois pas
comment faire...
Est-ce à moi de proposer au sein de ma lib de quoi interpréter
les exceptions lancées?
Par exemple une fonction virtuelle retournant un entier pour
chaque type d'exception, avec à côté une doc expliquant à
quelle erreur correspond chaque valeur? Et le client encadre
tous les appels aux fonctions de ma lib avec un try { }
catch(const DShow::Exception & e) {} et récupère cette valeur
et formatte un texte en conséquence?