捕获多个异常并使用Python传递给自定义异常处理程序

时间:2014-06-10 18:52:10

标签: python exception

我正在使用imapclient模块编写一些python代码,并希望捕获它的异常并向它们添加一些消息。我知道该模块有以下例外:socket.error,socket.gaierror,IMAP4.error,IMAP4.abort,IMAP4.readonly

首先,人们通常会将他们的自定义异常放在一个单独的模块中并导入它们,以保持代码清晰和干净吗?如果不是,为什么不呢?

其次,知道这个模块有什么异常,我不确定如何捕获所有这些异常,然后解密捕获的异常并使用自定义异常类适当地处理它。允许我添加额外的消息或我想做的任何事情。

第三,我是否有一个'MyException'类可能对我可能期望和传入的五个异常中的每一个都有不同的逻辑?

我的第一次可怜的尝试:

def some_func():
    try:
        login(email, password)
        print "logged into account as: %s " %email
    except Exception, e:
        raise MyException, e

class MyException(Exception):
    if Exception == socket.error:
        print 'Additional messaging here'
    elif Exception == something.else:
        do this

2 个答案:

答案 0 :(得分:0)

假设你真的想要这样做,你通常会这样做的方法是检查引发异常的地方的各种条件,并使用该信息来引发正确的异常。大致是:

# base class for your custom exceptions
class MyException(Exception):
    pass

# class to wrap socket error
class MySocketException(MyException):
    pass

# class for some other exception
class MyOtherException(MyException):
    pass

def some_func():
    try:
        login(email, password)
        print "logged into account as: %s " %email
    except socket.error:
        raise MySocketException, "My custom socket error message"
    except SomeOtherException:
        raise MyOtherException, "My custom error message"

这会引起你的问题:"捕获所有这些并解读哪一个"。这样做的方法是使用多个except子句,每个子句用于一起处理的每种异常(或一组异常)。然后,在每个except子句中,执行您要执行的操作以处理这些异常。这比在一个大的except子句中捕获它们并尝试稍后拆分它们要好。使用except的部分原因是它允许您指定要捕获的异常类型。

但是,您应该考虑为什么要这样做。使用仅替换那种错误的自定义异常类替换像socket.error这样的普通异常并没什么用处。在这种情况下,为什么不直接捕捉和处理socket.error?您通常会为特定于程序的各种错误创建异常类。

关于人们是否将例外置于单独的模块中的问题,这取决于您。通常,当它变得难以处理以将它们全部保存在同一模块中时,您应该将事物分成单独的模块。如果您的模块很小并且只定义了几个异常类,那么通常不需要为它们创建单独的模块。如果模块很大并且具有复杂的异常层次结构,您可能希望将它们拆分为单独的模块。

答案 1 :(得分:0)

  

首先,人们通常会将他们的自定义异常单独放在一起   模块并导入它们,以保持代码清晰和干净?如果不是,为什么不呢?

取决于。通常,如果自定义异常类型与当前模块中的代码密切相关(通常是这样),那么在那里定义它是最有意义的。

  

其次,知道这个模块有什么例外,我不是   确切地知道如何捕获所有这些,然后解密哪个   异常被捕获并使用自定义适当地处理它   异常类。

您不需要自定义异常类。像这样的东西会起作用:

try:
    ...
except (Exception1, Exception2, Exception3) as e:
    if isinstance(e, ...):
        do_this()
    elif isinstance(e, ...):
        do_that()
    else:
        do_something_else()

当然,您可以使用自定义错误类型进一步抽象,但您没有解释为什么需要它们。

  

第三,我是否会有一个' MyException'可能有不同的类   我可能期望的五个例外中的每一个的逻辑   并传入?

这取决于。我仍然不相信你需要一个自定义错误类。如果是关于共享代码,您可以轻松编写

try:
    ...
except (Exception1, Exception2, Exception3) as e:
    handle_exception(e)

然后只需定义一个有用的函数handle_exception(e)并从各个地方调用它。