在python中处理异常的首选方法

时间:2015-04-09 00:16:19

标签: python

什么更好?

class CustomException(Exception):
    pass

class CustomSomething(object):
    def do_something(self, xml):
        try:
            lxml.etree.parse(xml)
        except LxmlError as e:  # LxmlError class is only example
            raise CustomException(e)

或只是

class CustomSomething(object):
    def do_something(self, xml):
        lxml.etree.parse(xml)

我什么时候应该使用try / except块并引发自定义异常,什么时候应该让任何调用我的函数处理它?<​​/ p>

2 个答案:

答案 0 :(得分:1)

一般情况下,当您只是提出另一个异常时,我不需要添加try / except块。通常情况下,你提出的例外情况与你所调用的情况几乎相同(因为问题仍然相同)。我找不到的任何官方文档(#34; [s]imple is better than complex&#34;)除外;我能找到的最好的是the list of built-in exceptions,它说:

  

在创建可能引发多个不同错误的模块时,通常的做法是为该模块定义的异常创建基类,并为不同错误条件创建特定异常类的子类

这似乎只是解释如何创建自定义异常,但 时<。>

答案 1 :(得分:1)

在这种特殊情况下,我认为没有充分理由拥有自定义异常。我只在需要向调用者传递除内置异常之外的更多信息时才引入自定义异常。即使我不得不对内置异常进行一些特殊处理,一旦完成我的部分,我就会重新提出原始异常。

我能想到有自定义异常的其他原因是为了让类具有一致的接口,包括它可以引发的所有异常。

更重要的是要确保do_something方法记录它可以引发的所有异常(内置或自定义),以便用户知道要捕获的内容。