繁体   English   中英

异常必须从 BaseException 派生

[英]Exceptions must derive from BaseException

我在这里想念什么?

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()

错误:

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

MyBaseError class 已经从 BaseException 派生。

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

print(type(sys.exc_info()[2]))

我不确定您确实要做什么,但是sayonara()的工作版本如下:

def sayonara():
    try:
        run_me()
    except (MyBaseError) as e:
        raise MyBaseError("unable to run", e, e.args)

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

这意味着您应该引发异常 class 或其实例。 例如

try:
   1 + "String"
except TypeError:
   raise TypeError("unsupported operand type(s) for +: 'int' and 'str'")

暂无
暂无

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

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