Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Oracle] Traitement des exceptions

    4 mai 2011 à 10:10:02

    Bonjour,

    J'étais entrain de lire un cour sur les exceptions et j'ai bloqué sur ce paragraphe :

    Traiter les exceptions en langage PL/SQL :


    Une exception peut être traitée :
    • Par interception à l'aide d'un gestionnaire
    • Par propagation vers l'environnement appelant


    Pouvez-vous m'expliquer ? :)

    Merci d'avance ..
    • Partager sur Facebook
    • Partager sur Twitter
      4 mai 2011 à 20:26:35

      C'est tout bête - cela marche comme les blocs try {} catch {}. Tu es dans une fonction (mettons) et tu fais un SELECT ... INTO ... qui ne ramène rien. Cela déclenche une erreur (exception). Là, trois possibilités:
      * La requête n'est PAS dans un bloc qui se termine par une clause EXCEPTION. On sort de la fonction, on retourne à l'appelant, il se prend l'exception ("propagation vers l'environnement appelant") et tu remontes au début de mes explications et lis de nouveau.
      * Il y a une clause EXCEPTION, mais elle ne traite pas l'excpetion no_data_found (ce qui a été emis) ni other (clause attrape-tout, à déconseiller parce qu'apès pour le diagnostic des cas pas prévus c'est coton). Même punition que précédemment, sortie et émission de l'exception dans l'appelant.
      * Il y a une clause EXCEPTION avec WHEN no_data_found_THEN : on exécute le traitement spécifié, et l'on continue dans la fonction à partir de la fin du bloc ("interception à l'aide d'un gestionnaire" - où vont-ils chercher tout ça?).

      Si l'exception n'est attrapée nulle part dans la pile d'appel, erreur Oracle pas jolie (bien que plus jolie que ce que Java sort dans un cas similaire).
      • Partager sur Facebook
      • Partager sur Twitter
        5 mai 2011 à 0:31:59

        En gros il faut comprendre que si ton execption n'est pas géré, il va essayer de la géré dans les blocs parents.

        Ainsi
        BLOC 1
        BEGIN

        APPEL DU BLOC 2
        APPEL DU BLOC 3

        EXCEPTION

        END;

        BLOC 2
        BEGIN

        EXCEPTION

        END;

        Imagineons qu'une exception est levé, manuellement (tu peux définir tes propres exceptions) ou automatiquement par Oracle ton programme va aller directement dans la clause exception (ici du bloc 2) avec

        WHEN nom_de_lexception THEN
        // CE QUE TU VEUX

        Si elle n'est pas géré, dans le bloc 2. On va retourné au programme qui l'a appelé. C'est à dire le bloc 1, et comme oracle a déclaré qu'il y avait une exception et que celle-ci n'a toujours pas été gérée, on va aller directement dans le bloc exception de notre bloc 1. Ainsi on aurait pas appelé le BLOC 3.

        Si l'on avait géré une exception dans le bloc 2, le bloc 1 aurait pu continuer ses actions et aurait appelé le BLOC 3.
        • Partager sur Facebook
        • Partager sur Twitter

        [Oracle] Traitement des exceptions

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown