我想为我的班级创建一些自定义例外。我试图找出使这些异常类在派生类中可继承的最佳方法。本教程将介绍如何创建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
答案 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