我正在使用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
答案 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)
并从各个地方调用它。