gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:47:49 25 4
gpt4 key购买 nike

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

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

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

我不确定这是否警告我我正在 try catch 不是我的代码中 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() 没有引发异常的情况下,该命令仍会运行并执行正确的操作。

最佳答案

这意味着:

  • 在您的代码中,您有一个 except ...语句所在异常... (或序列 ... 中的异常(exception)之一)不是 BaseException 的子类, 和
  • 正在抛出一个异常,该异常被该 except ... 捕获。陈述。
  • TypeError只能在实际抛出异常时引发,因为您给 except ... 的名称必须对其当时的当前值进行评估;只是因为 TypeError在程序执行的某个时刻引用了一个特定的类并不意味着它以后不会被更改为引用另一个对象(尽管这无疑是不正常的)。

    Python 解释器应该为您提供异常的完整追溯;你需要做的第一件事就是找到这个。它可能发生在两种情况之一。 (这适用于单线程程序;我假设您的程序不是多线程的。)
  • 在程序执行期间,在这种情况下程序将被异常终止,或
  • 在对象的终结过程中(在它们的 __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作为清理过程的一部分。但在这种情况下,您的程序仍应成功退出。

    关于exception - 不允许捕获不是从 BaseException 继承的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46123418/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com