异常必须派生自 BaseException

Lok*_*wal 5 python exception python-3.x

我在这里缺少什么?

import sys

class MyBaseError(BaseException):
    def __init__(self, message, base_message=None, *args):
        
        self.message = message
        self.base_message = base_message
        super(MyBaseError, self).__init__()
        
        
    def __str__(self):
        if self.base_message is None:
            return self.message
        
        return self.message + " '" + str(self.base_message) + "'"
        
        
class MyError(MyBaseError):
    """
    """
    
class MyTypeError(MyError):
    """
    """

def run_me():
    raise MyTypeError("run_me")
    

def sayonara():
    try:
        run_me()
    except (MyBaseError) as e:
        raise(MyBaseError("unable to run",
                           e,
                           e.args),
                sys.exc_info()[2])
        
sayonara()
Run Code Online (Sandbox Code Playgroud)

错误:

Traceback (most recent call last):
  File "main.py", line 32, in sayonara
    run_me()
  File "main.py", line 27, in run_me
    raise MyTypeError("run_me")
__main__.MyTypeError: run_me

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 42, in <module>
    sayonara()
  File "main.py", line 40, in sayonara
    sys.exc_info()[2])
TypeError: exceptions must derive from BaseException
Run Code Online (Sandbox Code Playgroud)

MyBaseError 类已经派生自 BaseException。

gal*_*len 3

在您的sayonara()函数中,您似乎正在尝试引发一组异常。问题是这sys.exc_info()[2]是一个回溯,而不是异常,这是你中断的原因。我通过将以下行放在异常块的顶部来验证这一点:

print(type(sys.exc_info()[2]))
Run Code Online (Sandbox Code Playgroud)

我不确定你想做什么,但工作版本sayonara()如下:

def sayonara():
    try:
        run_me()
    except (MyBaseError) as e:
        raise MyBaseError("unable to run", e, e.args)
Run Code Online (Sandbox Code Playgroud)

如果您想包含回溯,则需要更新自定义错误类以处理传递的参数。