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

Dan*_*ite 5 exception errbot

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

每次我启动 bot 命令时,我都会收到:

Computer says nooo. See logs for details:
catching classes that do not inherit from BaseException is not allowed
Run Code Online (Sandbox Code Playgroud)

我不确定这是否警告我我正在尝试捕获不是我的代码中 BaseClass 的异常,或者是否在我的插件之外的其他地方引发并捕获了未知异常。

为了调试我试过:

try:
    do_the_thing()
except (TypeError, ValueError) as e:
    return('Something went wrong.')
Run Code Online (Sandbox Code Playgroud)

我也试过:

try:
    do_the_thing()
except Exception as e:
    return('Something went wrong.')
Run Code Online (Sandbox Code Playgroud)

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

Cur*_*son 3

代表着:

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

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

\n\n

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

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

在这两种情况下都应该有堆栈跟踪,而不仅仅是错误消息;我已经确认至少在 Python \xe2\x89\xa53.4 上会打印出情况 2 的堆栈跟踪。

\n\n

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

\n\n
TypeError = False\ntry:\n    ...\nexcept TypeError:\n    ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
class MyException:    # Doesn\'t inherit from Exception\n    ...\ntry:\n    ...\nexcept MyException:\n    ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n