Python 如何使用自定义异常处理类重写异常消息?
如何在Python 如何使用自定义异常处理类重写异常消息?,python,exception,Python,Exception,如何在MyException的方法中捕获具有相同名称的异常 并运行MyException中定义的相应方法?因为我想 用错误代码和错误消息重写错误消息 类或错误: #捕获django orm进程错误 通过 类系统错误: def索引器(自身): 打印(“索引错误,您需要…”) def SomeError1(自身): 打印('something1') def SomeError2(自身): 打印('something2') 类其他错误: 通过 类MyException(OrError、SysError
MyException
的方法中捕获具有相同名称的异常
并运行MyException
中定义的相应方法?因为我想
用错误代码和错误消息重写错误消息
类或错误:
#捕获django orm进程错误
通过
类系统错误:
def索引器(自身):
打印(“索引错误,您需要…”)
def SomeError1(自身):
打印('something1')
def SomeError2(自身):
打印('something2')
类其他错误:
通过
类MyException(OrError、SysError、OtherError):
#做点什么
通过
尝试:
lis=[]
a=lis[1]
除了我的例外:
#如何在MyException的方法中捕获具有相同名称的异常
#并运行MyException中定义的相应方法,因为我想
#重写错误消息
通过
例外情况除外,如e:
#打印未捕获错误
打印(e)
您可以尝试以下方法:
class MyException(Exception):
def IndexError(self):
print("index error, you need to ...")
def SomeError1(self):
print('something1')
def SomeError2(self):
print('something2')
try:
lis = []
a = lis[1]
except Exception as e:
error_name = e.__class__.__name__
if error_name in dir(MyException):
# If error is handled in custom MyException
ex = MyException()
ex_function = getattr(ex, error_name)
ex_function()
else:
# Otherwise, print default error message
print(e)
e.\uuuuu class\uuuu.\uuuuu name\uuuuuu
为您提供引发的异常类型,然后您可以使用该类型检查它是否在自定义类中定义/处理。我可以通过以下方式实现我的目标,但我认为这并不优雅。有更好的办法吗
类OrmHandleException(对象):
def IntegrityError(自):
打印('完整性错误')
#可能还有许多其他类型的异常
#我还想用独立类对其进行分类
类OtherException(对象):
通过
类MyExceptionHandler(OrmHandleException,OtherException):
定义调用(自身,错误):
错误\u handle\u method=getattr(self,type(错误)。\u名称\u,无)
如果错误处理方法不是无:
错误\u句柄\u方法()
其他:
打印(错误)
my_exception_handler=MyExceptionHandler()
尝试:
打印(‘在这里做点什么’)
lis=[]
a=lis[1]
除异常作为错误外:
我的\u异常\u处理程序(错误)
以您目前的方式使用类是对其他有效工具的滥用。你没有试图在这里封装任何东西。对于要转换的每个异常,您可以使用单独的方法,但是您缺少一种查找异常类型的方法
编辑内置异常消息的最简单方法是修改args
属性:
try:
enumerate(1)
except Exception as e:
print(e.args)
e.args = (e.args[0].replace('not ', ''),)
raise
结果是
("'int' object is not iterable",)
Traceback (most recent call last):
File "<ipython-input-131-740297d24fb6>", line 1, in <module>
try: enumerate(1)
TypeError: 'int' object is iterable
请注意,错误的来源不再是枚举
行:
("'int' object is not iterable",)
Traceback (most recent call last):
File "<ipython-input-134-b1123bf70859>", line 6, in <module>
raise e
File "<ipython-input-134-b1123bf70859>", line 2, in <module>
enumerate(1)
TypeError: 'int' object is iterable
请注意,如果您想像普通异常处理程序一样使用isinstance
功能,那么OrderedDict
与列表相比并没有多大优势。如果您想匹配精确的类,而不是使用isinstance
,则不需要排序,简单的dict
就可以了。在这种情况下,您必须在单独的键中列出每种类型。通常,isinstance
将接受一个元组,如上面所示的handler\u表的最后一个键所示
让处理程序接受完整异常对象的原因是,并非所有异常都将使用args
表示它们的str
(甚至有一个args
属性。如果您遇到一个使用不同机制创建字符串表示的类型,拥有完整的异常对象将允许您适应它
另外,不要忘记,它可以用来收集有关对象本身中不直接可用的异常的信息。您可能不想为此使用类。列表或有序字典会更好。基本上,您希望捕获所有内容,并在基于isins执行操作后重新引发相同的错误实例
或类型
查找。我不会帮助您找到正确答案,但我认为这应该是3个独立的异常类(Indexer、SomeError1和SomeError2)。每个类都将实现str方法。感谢您的帮助,我想重写许多异常消息(返回我的错误代码和错误消息)在我的项目中,使用不同的类来维护错误类型,有些类有超过10种类型的错误。你不能捕获并重新引发每个异常吗?例如,try-除了indexer;raise indexer(“我的消息”)
--除非在我的项目中有大量不同的异常,否则有超过30种类型的错误代码,我不认为使用try-except是维护不同类型错误的好方法,有些错误可能是由django-orm引起的,有些错误可能是由django-orm引起的。谢谢,我的想法与你的非常相似。非常感谢。我使用不同方法的类d为了管理类似的类型错误,如果我使用您的解决方案,这很难做到,我需要维护映射,此外,我需要导入许多异常类型作为OrderedDict元组的第一项。这是我当前的想法:类只是一个命名空间。我不知道为什么这样做比滥用类更难。您显示的所有方法都可以是@staticmethod
,这意味着您不需要一个类来开始…您至少需要my\u exception\u handler()(错误)
否则,您只需初始化带有错误的MyExceptionHandler
的实例,该实例不起任何作用。甚至可能会引发另一个错误…my_exception_handler
是MyExceptionHandler
的实例,当我调用my_exception_处理程序(错误)
时,它将调用\uu调用(self,error)
,我不需要再次启动它。对。我读错了。但是,再一次,为什么你要用一个\uuuu调用
方法创建一个完整的类,仅仅使用一个实例作为函数呢?为什么不只使用一个函数呢?因为这样可以通过继承的类来管理类似类型的不同错误。它更优雅,更灵活乐,用一种方法。你真的很聪明
("'int' object is not iterable",)
Traceback (most recent call last):
File "<ipython-input-134-b1123bf70859>", line 6, in <module>
raise e
File "<ipython-input-134-b1123bf70859>", line 2, in <module>
enumerate(1)
TypeError: 'int' object is iterable
from collections import OrderedDict
def handleIndexError(e):
e.args = ('You need to work on the size of your index',)
def handleMyCustomError(e):
e.args = (f'Really, be more careful: some attribute {e.attr} needs to be better',)
def handleBadException(e):
e.args = (f'This is a {type(e).__name__} error with message "{e.args[0]}"',)
handler_table = OrderedDict([
(IndexError, handleIndexError),
(MyCustomError, handleMyCustomError),
((MemoryError, OSError), handleBadException)])
def overwrite_exception(exception, table):
for cls, handler in table:
if isinstance(exception, cls):
return handler(exception)
try:
lis = []
a = lis[1]
except Exception as e:
overwrite_exception(e, handler_table)
raise