python中可继承的自定义异常

时间:2009-12-17 20:33:30

标签: python

我想为我的班级创建一些自定义例外。我试图找出使这些异常类在派生类中可继承的最佳方法。本教程将介绍如何创建Exception类。所以我这样做了:

我创建了一个baseclass.py:

class Error(Exception):
    """Base class for exceptions in BaseClass"""
    pass

class SomeError(Error):
    """Exection for some error"""
    def __init__(self, msg):
        self.msg = msg

class OtherError(Error):
    """Exection for some error"""
    def __init__(self, msg):
        self.msg = msg

class BaseClass():
    """Base test class for testing exceptions"""

    def dosomething(self):
        raise SomeError, "Got an error doing something"

来自derivedclass.py:

from baseclass import BaseClass,SomeError,OtherError

class DerivedClass(BaseClass):

    def doother(self):
        """Do other thing"""
        raise OtherError, "Error doing other"

然后使用DerivedClass的测试:

#!/usr/bin/python
from derivedclass import DerivedClass,SomeError,OtherError

"""Test from within module"""
x = DerivedClass()
try:
    x.dosomething() 
except SomeError:
    print "I got some error ok"

try:
    x.doother()
except OtherError:
    print "I got other error ok"

正如您所看到的,我将基类中的异常类导入到派生类中,然后再将派生类导入到程序中。

这似乎工作正常,但不是很优雅,我担心必须确保并在派生类模块中为所有Exception类执行导入。在创建新的派生类时,似乎很容易忘记一个。然后,如果派生类的用户尝试使用它,则会收到错误。

有更好的方法吗?

谢谢!

-Mark

3 个答案:

答案 0 :(得分:0)

必须在其使用的所有模块中导入自定义异常。

此外,derivedclass.py

中存在错误
Wrong (because of the way its imported)
raise baseclass.OtherError, "Error doing other"

Fixed
raise OtherError, "Error doing other"

答案 1 :(得分:0)

  

你可以看到,我导入了   基类的异常类   进入派生类,然后再次   从派生类进入   程序

您没有,也不能从类和类中导入异常(或任何内容)。您可以从模块和(通常)导入模块中的东西。

(通常,因为您可以将import语句放在任何范围内,但不建议这样做)

  

这似乎工作正常,但不是很好   优雅,我很担心   确保并进行导入   所有的派生类模块   异常类。看起来好像   很容易忘记一个   创建一个新的派生类。然后一个   派生类的用户会得到一个   如果他们试图使用它就会出错。

派生类的模块没有理由需要从基类中导入所有异常。如果你想让客户端代码很容易知道从哪里导入异常,只需将所有异常放在一个名为“errors”或“exceptions”的单独模块中,这就是Python中常见的习惯用法。

另外,如果您在管理异常命名空间时遇到问题,可能您的异常太精细了,而且您可以使用更少的异常类。

答案 2 :(得分:0)

如果用户按名称导入错误类,一旦import语句尝试执行,他们就会注意到问题:

ImportError: cannot import name FrotzError
File "enduser.py", line 7, in <module>
  from ptcmark.derivedclass import FrotzError

当然你会记录他们所谓的来从哪里获取异常类,所以他们只需要查找它然后改变他们的代码来做正确的事情:

from ptcmark.errors import FrotzError