Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用自定义异常处理类重写异常消息?_Python_Exception - Fatal编程技术网

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