IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

catcher et lever une exception "others"


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut catcher et lever une exception "others"
    Bonjour,

    je voudrais dans une procédure attraper toutes les exceptions par un "when others" afin de pouvoir logguer les paramètres d'entrée de la fonction en question, mais par la suite laisser l'exception se lever...
    Comment puis-je faire?

    Je sais que pour lancer une exception il faut faire un raise, mais je ne sais pas quelle variable utiliser pour accéder à l'exception que je viens de catcher.

  2. #2
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonsoir,

    Voici une page d'aide EXCEPTIOn en 10G,

    ca pourrait peut etre t'aider


    http://download.oracle.com/docs/cd/B...rors.htm#i3329

    asktom.oracle.com tahiti.oracle.com otn.oracle.com

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.


    phrase chinoise issue du Huainanzi

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 38
    Points : 47
    Points
    47
    Par défaut
    Bonsoir,

    Dans l'idée le raise t'envoie vers le bloc exception le plus proche (celui compris dans le bloc begin end englobant)
    une fois dans le bloc exception tu fais ta gestion d'erreur
    La une seule erreur est traitée (celle levée par le raise en l'occurence)
    Tu mets en place ta gestion d'erreur SQLERRM et SQLCODE devrait etre fort utile
    Et la tu sors du bloc begin/end (on l'appelera bloc 1)
    Il te suffit alors d'englober le bloc 1 par un autre bloc begin/end pour enchainer d'autres instructions avec un log des exceptions rencontrées.

    Pour l'analogie ca équivaut au try/catch de java

    Bonne continuation

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    EXCEPTION
      WHEN OTHERS
        THEN
          DBMS_OUTPUT.put_line ('ERROR: ' || DBMS_UTILITY.FORMAT_ERROR_STACK);
          raise_application_error( -20001,'Error:'||SQLCODE||'-'||SQLERRM);
    END;
    ---
    Farid

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Bonjour,

    merci pour votre aide. J'ai finalement trouvé ce que je cherchais sur la page donnée par fatsora :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WHEN salary_too_high THEN
          -- first step in handling the error
          DBMS_OUTPUT.PUT_LINE('Salary ' || erroneous_salary || ' is out of range.');
          RAISE;  -- reraise the current exception
    En l'occurence le "RAISE;" tout seul, qui lève à nouveau l'exception courante.

    Mon but était de faire l'équivalent java de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch (Exception e) {
    log(e);
    throw e;
    }
    Farid_92, je pense que pour avoir l'équivalement il aurait fallu que je remplace le "-20001" par "SQLCODE". Mais bon, je ne vais pas me compliquer la vie si un raise seul marche

    Merci à tous.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    ah je connaissais pas le raise tout seul, je vais pourvoir changer un de mes script maintenant

    le -20001 est dans les plages des codes erreurs qui sont reserve aux "custom error codes" par oracle (-20000 a je ne sais plus combien...).

    ---
    Farid.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Ah ok, on est obligé d'utiliser les customer codes, donc dans tous les cas on n'aurait pas pu relancer exactement la même exception avec cette méthode...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    je ne suis pas sure qu'on ne puisse pas reutiliser les codes oracles ???
    mais ils ont alloue une plage pour les utilisateurs pour mettre leur propre codeet message.

    En java ca serait l'equivalent de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class MonExceptionAlpha extends Exception
      {
      ...
      }
    ---
    Farid

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/07/2008, 15h36
  2. lever une EXCEPTION pour 2 blocs séparés
    Par atruong dans le forum Oracle
    Réponses: 2
    Dernier message: 05/05/2006, 10h27
  3. [SQL]Lever une exception sans planter le code
    Par Titouf dans le forum Oracle
    Réponses: 2
    Dernier message: 25/01/2006, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo