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