繁体   English   中英

python中的可继承自定义异常

[英]Inheritable custom exceptions in 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"

还有一个派生的class.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类在派生类模块中进行导入。 在创建新的派生类时,似乎很容易忘记一个。 然后,如果派生类的用户尝试使用它,则会收到错误消息。

有一个更好的方法吗?

谢谢!

-标记

自定义例外必须导入其使用的所有模块中。

另外,derivedclass.py中存在错误

Wrong (because of the way its imported)
raise baseclass.OtherError, "Error doing other"

Fixed
raise OtherError, "Error doing other"

如您所见,我将异常类从基类导入到派生类中,然后再次从派生类导入到程序中。

您没有也不能从类中将异常(或任何东西)导入到类中。 您从模块导入事物,并且(通常)将其导入模块。

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

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

派生类的模块没有理由需要从基类中导入所有异常。 如果要使客户端代码更容易知道从何处导入异常,只需将所有异常放在名为“错误”或“异常”的单独模块中,这是Python中的常见用法。

另外,如果您在管理异常名称空间时遇到麻烦,则可能是因为您对异常的了解太细了,因此可以使用更少的异常类。

如果用户通过名称导入您的错误类,则他们将在import语句尝试执行后立即注意到该问题:

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

当然,您将记录他们应该从哪里获取异常类,因此他们只需查找它们,然后更改其代码以执行正确的操作:

from ptcmark.errors import FrotzError

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM