不允许捕获不从BaseException继承的类

时间:2017-09-08 19:31:10

标签: exception errbot

我正在制作一个自定义插件来查询数据库以获取用户信息以帮助客户支持。我的后端很懈怠。

每当我启动机器人命令时,我都会问:

Computer says nooo. See logs for details:
catching classes that do not inherit from BaseException is not allowed

我不确定这是否警告我,我试图在我的代码中捕获不是BaseClass的异常,或者是否引发了一个未知异常并在我的插件之外的其他位置捕获

要调试我试过:

try:
    do_the_thing()
except (TypeError, ValueError) as e:
    return('Something went wrong.')

我也尝试过:

try:
    do_the_thing()
except Exception as e:
    return('Something went wrong.')

我仍然得到了错误的警告。请注意,该命令仍然运行,并且在do_the_thing()没有引发异常的情况下执行正确的操作。

1 个答案:

答案 0 :(得分:1)

这意味着:

  1. 在代码中的某些地方,您有一条except ...语句,其中异常...(或序列...中的异常之一)不是BaseException的子类,和
  2. 正在抛出该except ...语句捕获的异常。

仅当实际引发异常时才可以引发TypeError,因为您当时给except ...赋予的名称必须对其当前值求值;仅仅因为TypeError在程序执行的某个时刻引用了一个特定的类并不意味着它以后将不会更改以引用另一个对象(尽管这当然是错误的)。

Python解释器应该为您提供对该异常的完整追溯;您需要做的第一件事就是找到这个。它可能在两种情况之一中发生。 (这是用于单线程程序;我假设您的程序不是多线程的。)

  1. 在程序执行期间,在这种情况下,程序将被异常终止,或者
  2. 在对象完成期间(在其__del__(self)函数中),在这种情况下,错误将被打印到stderr。

在两种情况下都应该有一个堆栈跟踪,而不仅仅是错误消息。我已经确认至少在情况≥3.4的Python上会打印出堆栈跟踪信息。

然后,您需要遵循此堆栈跟踪信息以查看问题所在。请记住,您赋予except ...的名称是可以重新分配的变量(甚至是TypeError之类的变量),因此可以想象,您可能正在处理类似(反常)的情况:

TypeError = False
try:
    ...
except TypeError:
    ...

但更可能是一些明显的东西,例如:

class MyException:    # Doesn't inherit from Exception
    ...
try:
    ...
except MyException:
    ...

您需要注意一种特殊情况:如果在程序退出时看到输出到stderr的消息(案例“ 2.在完成期间,”在上面)被打印出来,这意味着在清理过程中抛出了异常,解释器关闭,在该过程中,整个程序中的随机变量可能已作为清理过程的一部分设置为None。但是在这种情况下,您的程序仍应成功退出。