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

Python Discussion :

exceptions avec plusieurs arguments


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Par défaut exceptions avec plusieurs arguments
    Bonjour à tous.

    Je débute en python, je m'intéresse en ce moment aux user-defined exceptions.

    J'ai réussi à créer une classe d'exception simple, à la lever et à la traiter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class MyError(Exception):
    	def __init__(self, a):
    		self.a = a
     
    def func():
    	print "entering func"
    	raise MyError(42)
    	print "leaving func"
     
    def main():
    	print "entering main"
    	try:
    		func()
    	except MyError, e:
    		print "alert", e.a
    	print "leaving main"
    entering main
    entering func
    alert: 42
    leaving main
    J'aimerai maintenant avoir 2 arguments à mon exception. J'ai réussi à faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class MyError(Exception):
    	def __init__(self, a, b):
    		self.a = a
    		self.b = b
     
    def func():
    	print "entering func"
    	raise MyError(42, 'blablabla')
    	print "leaving func"
     
    def main():
    	print "entering main"
    	try:
    		func()
    	except MyError, e:
    		print "alert", e.a, e.b
    	print "leaving main"
    entering main
    entering func
    alert: 42 blablabla
    leaving main
    Seulement, je voudrais utiliser une syntaxe de cette forme, bien plus élégante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	except IOError, (errno, strerror):
    C'est possible en levant directement une exception de la classe de base Exception:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def func():
    	print "entering func"
    	raise Exception(42, "blablabla")
    	print "leaving func"
     
    def main():
    	print "entering main"
    	try:
    		func()
    	except Exception, (a, b):
    		print "alert", a, b
    	print "leaving main"
    entering main
    entering func
    alert: 42 blablabla
    leaving main
    Mais si j'essaye de faire ça avec ma propre classe d'exceptions, j'obtiens une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class MyError(Exception):
    	def __init__(self, a, b):
    		self.a = a
    		self.b = b
     
    def func():
    	print "entering func"
    	raise MyError(42, "blablabla")
    	print "leaving func"
     
    def main():
    	print "entering main"
    	try:
    		func()
    	except MyError, (a, b):
    		print "ex", a, b
    	print "leaving main"

    entering main
    entering func
    Traceback (most recent call last):
    File "./test.py", line 20, in main
    except MyError as (a, b):
    ValueError: need more than 0 values to unpack
    Quelqu'un peut-il m'expliquer ce qui ne va pas ?

    Merci

    Julien

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 115
    Par défaut
    Il y a deux solutions possibles :

    Soit tu gardes ta redefinition de __init__ mais tu ajoutes le membre args comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MyError(Exception): 
            def __init__ (self, value1, value2):
                    self.value1 = value1
                    self.value2 = value2
                    self.args = (value1, value2)
     
    try:
            raise MyError('toto', 'otot')
    except MyError as (value1, value2):
            print 'Exception:', value1, value2
    Soit tu ne redefinies pas __init__ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class MyError(Exception): pass
     
    try:
            raise MyError('toto', 'otot')
    except MyError as (value1, value2):
            print 'Exception:', value1, value2

  3. #3
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonjour, juste pour info sous Python 3, le code ci-dessus devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #! /usr/bin/env python3
     
    # Source
    #    http://www.developpez.net/forums/d995807/autres-langages/python-zope/general-python/exceptions-plusieurs-arguments/#post5572297
     
    class MyError(Exception):
        def __init__ (self, value1, value2):
            self.value1 = value1
            self.value2 = value2
     
    try:
        raise MyError('toto', 'zaza')
    except MyError as e:
        print('Exception:', e.value1, e.value2)

Discussions similaires

  1. [XL-2003] Fonction 'like' avec plusieurs arguments
    Par bdoux33 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/05/2009, 14h44
  2. Réponses: 1
    Dernier message: 03/06/2008, 10h21
  3. somme avec plusieurs arguments
    Par new_wave dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/05/2007, 19h12
  4. callback avec plusieurs arguments
    Par Claiw dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 23/12/2006, 18h46
  5. switch avec plusieurs arguments
    Par lazzeroni dans le forum Langage
    Réponses: 4
    Dernier message: 18/07/2006, 13h34

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