5

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

每次我启动 bot 命令时,我都会受到欢迎:

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.')

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

4

1 回答 1

3

代表着:

  1. 在您的代码中的某处,您有一个except ...语句,其中异常...(或序列中的异常之一...)不是 , 的子类BaseException,并且
  2. except ...该语句捕获的异常被抛出。

TypeError只能在实际抛出异常时引发,因为您给定的名称必须except ...在当时对其当前值进行评估;仅仅因为TypeError在程序执行的某个时刻引用了一个特定的类并不意味着它以后不会被更改为引用另一个对象(尽管这无疑是不正当的)。

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

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

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

然后,您需要遵循此堆栈跟踪以查看问题所在。请记住,您赋予的名称是可以重新分配except ...变量(甚至是 .TypeError

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

但更有可能是一些显而易见的事情,例如:

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

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

于 2018-10-17T08:52:50.307 回答