try - Excepciones de Python personalizadas con códigos de error y mensajes de error
try except anidados python (1)
class AppError(Exception):
pass
class MissingInputError(AppError):
pass
class ValidationError(AppError):
pass
...
def validate(self):
""" Validate Input and save it """
params = self.__params
if ''key'' in params:
self.__validateKey(escape(params[''key''][0]))
else:
raise MissingInputError
if ''svc'' in params:
self.__validateService(escape(params[''svc''][0]))
else:
raise MissingInputError
if ''dt'' in params:
self.__validateDate(escape(params[''dt''][0]))
else:
raise MissingInputError
def __validateMulti(self, m):
""" Validate Multiple Days Request"""
if m not in Input.__validDays:
raise ValidationError
self.__dCast = int(m)
validate () y __validateMulti () son métodos de una clase que valida y almacena los parámetros de entrada pasados. Como es evidente en el código, elevo algunas excepciones personalizadas cuando falta algún parámetro de entrada o falla alguna validación.
Me gustaría definir algunos códigos de error personalizados y mensajes de error específicos de mi aplicación como,
Error 1100: "Parámetro clave no encontrado. Verifique su entrada".
Error 1101: "Parámetro de fecha no encontrado. Verifique su entrada"
...
Error 2100: "El parámetro Día Múltiple no es válido. Los valores aceptados son 2, 5 y 7".
e informar lo mismo al usuario.
- ¿Cómo defino estos códigos de error y mensajes de error en las excepciones personalizadas?
- ¿Cómo elevo / atrapo la excepción de forma que sé qué código / mensaje de error mostrar?
(PD: Esto es para Python 2.4.3).
Bastien Léonard menciona en este comentario SO que usted no necesita definir siempre un nuevo __init__
o __str__
; de forma predeterminada, los argumentos se colocarán en self.args y se imprimirán con __str__
.
Por lo tanto, la solución que prefiero:
class AppError(Exception): pass
class MissingInputError(AppError):
# define the error codes & messages here
em = {1101: "Some error here. Please verify.", /
1102: "Another here. Please verify.", /
1103: "One more here. Please verify.", /
1104: "That was idiotic. Please verify."}
Uso:
try:
# do something here that calls
# raise MissingInputError(1101)
except MissingInputError, e
print "%d: %s" % (e.args[0], e.em[e.args[0]])
Aquí hay un ejemplo rápido para escribir una clase Exception
personalizada con códigos especiales ...
class ErrorWithCode(Exception):
def __init__(self, code):
self.code = code
def __str__(self):
return repr(self.code)
try:
raise ErrorWithCode(1000)
except ErrorWithCode as e:
print "Received error with code:", e.code
Editar Como estabas preguntando sobre cómo usar args
aquí hay un ejemplo adicional ...
class ErrorWithArgs(Exception):
def __init__(self, *args):
# *args is used to get a list of the parameters passed in
self.args = [a for a in args]
try:
raise ErrorWithArgs(1, "text", "some more text")
except ErrorWithArgs as e:
print "%d: %s - %s" % (e.args[0], e.args[1], e.args[2])