none
Propagation des Exceptions RRS feed

  • Question

  • Bonjour j'ai un petit soucis,

    Dans une DLL j'ai diverse fonction qui gere les exceptions, seulement dans certaine fonction je leve un evenements a l'interrieur de mon try catch.

    Exemple :

    Code Snippet

    public event OnDataEventhandler OnData;

    function void truc(byte[] data)

    {


    try
    {


    ...Des lignes de codes
    ...Des lignes de codes
    ...Des lignes de codes
    ...Des lignes de codes

    if(OnData!=null) { OnData(data); }

    ...Des lignes de codes
    ...Des lignes de codes
    ...Des lignes de codes
    ...Des lignes de codes

     

    }
    catch(Exception e)
    {


    WriteDebug(e);


    }

     

    }

     

    Jusqu'a la, pas de soucis, ca fonctionne nickel.

    Seulement a partir du moment ou je ne place pas de try catch dans la function qui recupere l'evenement OnData et que cette meme function qui recupere l'evenement OnData genere un Exception,c'est ma function truc qui la gere et ca, ca va pas.

     

    C'est logique cela dit, mais y a t'il un moyen qu'il n'y est pas propagation des evenements au evenements que j'appel ?

     

    J'espere m'etre fait comprendre.

     

    Cordialement

     

    Daniel,

    jeudi 16 octobre 2008 20:17

Réponses

  • Bonjour,

     

    Voilà qui est plus clair !

     

    C'est le principe même des exceptions. Le but étant de remonter l'exception jusqu'à ce que quelqu'un soit capable de traiter l'exception.

     

    Dans votre cas, si vous souhaitez palier à ce problème, il faudra metre un bloc try/catch dans la méthode _machine_OnData.

     

    Code Snippet

    static void _machin_OnData(byte[] data)

    {

    try

    {

    throw new NotImplementedException();

    }

    catch(...)

    {

     

    }

    }

     

     

    Cordialement

     

    vendredi 17 octobre 2008 10:57
    Modérateur

Toutes les réponses

  • Bonjour,

     

    C'est logique cela dit, mais y a t'il un moyen qu'il n'y est pas propagation des evenements au evenements que j'appel ?

     

    J'espere m'etre fait comprendre.

    Non, j'ai du mal à comprendre...

     

    En fait, si vous souhaitez traiter uniquement des exceptions qui vous interesse, il faut dans votre cas agire au niveau du catch() (soit au niveau du type d'exception à récupérer), soit dans le bloc lui même.

     

    Un article qui pourrait vous interesser pour mettre tout au point au niveau des exceptions :

    http://gilles.tourreau.fr/dotnet/dotnet_framework_en_general/dotnet_comprendre_la_philosophie_des_exceptions_sous_dotnet.html

     

    Cordialement

     

    vendredi 17 octobre 2008 08:51
    Modérateur
  • Donc effectivement je n'etais pas tres clair hier soir,  je m'en excuse, je vais essayer d'etre plus clair.

     

    Donc voila quelques morceaux de code pour m'expliquer :

     

    Une classe:

     

    Code Snippet

    namespace TestPropagation

    {

    public class Machin

    {

    public delegate void OnDataEventHandler(byte[] data);

    public event OnDataEventHandler OnData;

     

    public bool Truc()

    {

    try

    {

    byte[] d = new byte[1];

    if (OnData != null) { OnData(d); }

    return true;

    }

    catch (Exception e)

    {

    Console.WriteLine("Une Erreur est survenue dans Machin.Truc()");

    return false;

    }

    }

    }

    }

     

     

    Un Main :

     

    Code Snippet

    namespace TestPropagation

    {

    class Program

    {

    private static Machin _machin;

     

    static void Main(string[] args)

    {

    _machin = new Machin();

    _machin.OnData += new Machin.OnDataEventHandler(_machin_OnData);

    while (true)

    {

    if (_machin.Truc() == false)

    {

    Console.WriteLine("Machin.Truc à echoué");

    }

    else

    {

    Console.WriteLine("Machin.Truc à reussi");

    }

    Console.WriteLine("Presser Entrer pour recommencer");

    Console.ReadLine();

    }

    }

     

    static void _machin_OnData(byte[] data)

    {

    throw new NotImplementedException();

    }

    }

    }

     

     

    La sortie du programme :

     

    Code Snippet

    Une Erreur est survenue dans Machin.Truc()
    Machin.Truc à echoué
    Presser Entrer pour recommencer

     

     

    Donc l'exception NotImplementedException lever par static void _machin_OnData(byte[] data)

    est remonté à Machin.Truc vu que c'est cette classe qui a lever l'évènement.

     

    Ce que j'aimerai c'est que les exception lever dans les fonctions qui gere les evenements de ma classe ne soit pas remonté dans cette classe, mais reste dans la fonction qui gere l'evenement.

     

    En gros dans le cas présent, que visual studio leve une exception non gerer sur la ligne throw new NotImplementedException(), et qu'il arrete donc de me dire que c'est Machin.Truc() qui à rencontré une erreur.

     

     

    Cordialement

     

    Daniel Silvestre

     

    PS : Url de la source de mon test : http://indealsoft.com/downloads/TestPropagation.zip

     

    vendredi 17 octobre 2008 09:42
  • Bonjour,

     

    Voilà qui est plus clair !

     

    C'est le principe même des exceptions. Le but étant de remonter l'exception jusqu'à ce que quelqu'un soit capable de traiter l'exception.

     

    Dans votre cas, si vous souhaitez palier à ce problème, il faudra metre un bloc try/catch dans la méthode _machine_OnData.

     

    Code Snippet

    static void _machin_OnData(byte[] data)

    {

    try

    {

    throw new NotImplementedException();

    }

    catch(...)

    {

     

    }

    }

     

     

    Cordialement

     

    vendredi 17 octobre 2008 10:57
    Modérateur
  • Merci Gilles,

     

    Effectivement cette solution fonctionne, j'avais deja proposer cette solution.

     

    Le bout de code posant probleme ce trouve dans un library reseau que je met à disposition et les utilisateurs ne comprennais pas pourquoi leurs exceptions n'etaient pas levées mais gerées par le debugger de ma library.

     

    La solution de leur demander de mettre un try catch dans le code qu'ils génère (ce que je trouve pour ma part plus que logique) ne les as pas motivés.

     

    Je viens par ailleurs de trouver une solution tierce qui pourra convenir au deux parties.

     

    Il suffit de lever l'évenement de facon asynchrone afin qu'il ne soit plus géré dans le meme thread et donc dans le meme try catch.

     

    if (OnData != null) { OnData.BeginInvoke(d,null,null); }

     

    Dans tout les cas merci Gilles de vos réponses et de votre aide.

     

    Cordialement,

     

    Daniel Silvestre.

    vendredi 17 octobre 2008 12:03