如何查看通道消费者引发的异常

2024-02-22

我开始使用django-channels我觉得这太棒了。然而,调试消费者是痛苦的,因为当消费者内部引发一些异常时,没有任何内容打印到终端,websocket 只是断开连接。

未显示的异常类型不易识别。系统地情况是这样的AssertionError,还有其他一些,例如下面的代码:

class MexicoProgressConsumer(ProgressConsumer):
    def init(self, SSDBConfig, Sub_application):
        subappli = models.Sub_application.objects.get(pk=Sub_application)
        ...

使用错误数量的参数调用此方法不会在控制台上打印任何内容并断开 Websocket。同上,如果get最后一行失败。

有没有办法像其他异常一样查看这些异常?


从阿尔巴尔开始answer /questions/54458852/how-to-see-exceptions-raised-from-a-channels-consumer/54494878#54494878,我达到的解决方案是像这样定义一个装饰器

from functools import wraps
from logging import getLogger

from channels.exceptions import AcceptConnection, DenyConnection, StopConsumer

logger = getLogger("foo-logger")

def log_exceptions(f):
    @wraps(f)
    async def wrapper(*args, **kwargs):
        try:
            return await f(*args, **kwargs)
        except (AcceptConnection, DenyConnection, StopConsumer):
            raise
        except Exception as exception:
            if not getattr(exception, "logged_by_wrapper", False):
                logger.error(
                    "Unhandled exception occurred in {}:".format(f.__qualname__),
                    exc_info=exception,
                )
                setattr(exception, "logged_by_wrapper", True)
            raise

    return wrapper

这有几个改进:

  • 使用 functools.wraps 使包装函数更类似于原始函数。
  • 使用异步/等待语法,因为我正在使用异步消费者(如果不是,请删除)
  • 不记录 django-channels 故意引发的几个异常。
  • 仅在没有该属性时记录异常logged_by_wrapper放。这会导致异常仅记录一次,因为我们在第一次记录后设置了该属性。
  • 使用python的内置logging模块来记录错误。这会自动格式化异常和回溯,因为我们在exc_info=exception.

然后,我定义了一个类装饰器,而不是基类,以将其应用于消费者的方法

from inspect import iscoroutinefunction

def log_consumer_exceptions(klass):
    for method_name, method in list(klass.__dict__.items()):
        if iscoroutinefunction(method):
            setattr(klass, method_name, log_exceptions(method))

    return klass

这适用log_exceptions对于 Consumer 中定义的所有异步方法,但不是它继承的方法 - 即仅对于 Consumer 的自定义方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何查看通道消费者引发的异常 的相关文章

随机推荐

  • 如何使用h5py将数据写入复合数据?

    我知道在c我们可以使用轻松构建复合数据集struct逐块键入并分配数据 我目前正在实施类似的结构Python with h5py import h5py import numpy as np we create a h5 file f h5
  • Intellij Git 命令不起作用

    我的 Intellij Java 项目中的 git 集成存在问题 当我尝试执行提交时 无论我是否更改了任何内容 总是会出现相同的消息 未检测到任何更改 此外 当我试图拉东西时 没有任何动作 在 Intellij 的版本控制选项卡中 只有一条
  • 从startup.cs asp.net core重定向用户

    我有一个要求 我想检查数据库是否已连接 我有相应的类 如果此类的方法返回 false 那么我想重定向到将进行设置的数据库页面 视图 我有Asp Net核心身份 我想在 EF core 尝试连接到数据库之前检查此情况 我尝试使用以下命令 但返
  • setText 时不能使用 Frame.origin

    我正在使用下一个代码来淡出并向上滚动我的文本字段 但我刚刚注意到当我使用类似的东西时 textField setText something or textField resignFirstResponder 我失去了向上滚动的能力 任何人
  • JFreechart X和Y轴缩放

    可以在jfreechart中设置轴刻度值吗 例如 我想要 X 轴刻度为 10 Y 轴刻度为 1 您设置了TickUnit 如果您使用的是XYPlot尝试这个 XYPlot plot chart getXYPlot NumberAxis xA
  • 为什么我的一些 HTML 内部链接有效,而另一些则无效?

    救命 我对这个世界完全陌生 我正在首页上制作一个菜单栏 并链接到网站上的其他页面 以下是代码示例 ul li a href About a li li a href The Therapist a li li a href Pay what
  • 视网膜图像中的血管分割

    我正在尝试在视网膜图像中追踪血管 目前我正在使用 cv2 的阈值函数来使血管与周围视网膜的对比度更高 from matplotlib import pyplot as plt import cv2 img cv2 imread misc i
  • 并发 C++ 程序中的可见性

    我知道在 Java 中 从另一个线程访问成员时不能保证成员的可见性 含义是访问线程可能会看到该成员的窃取值 因为缓存尚未刷新到主内存 我想知道C 是否也是如此 也在 C 11 中 如果是这样 你如何在 C 中解决这个问题 在Java中 可以
  • backbone.js 获取缓存的结果

    我在以下backbone js控制器的索引操作中使用fetch App Controllers PlanMembers Backbone Controller extend routes index index function var p
  • Linq 中的多个 WHERE 子句

    我是 LINQ 新手 想知道如何执行多个 where 子句 这就是我想要实现的 通过过滤掉某些用户名来返回记录 我尝试了下面的代码 但没有按预期工作 DataTable tempData DataTable grdUsageRecords
  • PHP $_GET 未从 Web 浏览器填充 URL 查询参数

    我遇到了一个奇怪的问题 GET and REQUEST 变量为空 即使正在传递参数 我的 PHP 代码 echo SERVER REQUEST URI echo print r REQUEST echo print r GET Output
  • MVVM light - 如何访问其他视图模型中的属性

    我正在使用 mvvm light 构建 Silverlight 应用程序 是否有代码片段显示如何从另一个视图模型或用户控件的隐藏代码中访问视图模型的属性或命令 我想这很简单 但我不知何故错过了一些东西 Ueli 您可以使用 Messenge
  • 控制器内的 SignalR 身份验证?

    我正在使用 SignalR 但我似乎无法掌握身份验证来构建用于公共聊天和安全聊天的演示应用程序 有一个聊天室 我想演示经过身份验证的用户将收到公共消息and经过身份验证的用户消息 身份验证是使用现有的 MVC 3 Internet 应用程序
  • 编写无需 requirejs 即可运行的 Requirejs 模块

    我想以某种方式创建我的模块 它们可以与 requirejs 一起使用 也可以不与 requirejs 一起使用 如果没有 require js 它们应该正常工作 所以我必须确保它们正确加载 比如以正确的顺序放置脚本标签 所以 jQuery
  • 你好,我刚刚用 pip 安装了 requests 但无法导入它

    例如我的代码是 import requests r requests get https www python org r status code 结果是 Traceback most recent call last File C Use
  • 添加多个自定义http请求标头之谜

    HttpGet request new HttpGet https 192 168 1 140 8732 我想知道为什么我只能成功发送自定义标头 UserName 和 AuthToken 如果我执行以下操作 request setHeade
  • 使用一些曲线球在 Swing JTextArea 上强制执行最大字符数

    我正在尝试向 Swing JLabel 和 JTextArea 添加功能 以便 用户只能在文本区域输入 500 个字符 最多 标签包含一条字符串消息 告诉用户还剩下多少个字符 每次击键或退格后 当组件初始化时 标签显示 最多 500 个字符
  • 为Android项目创建自己的jar库时出错

    目前我正在研究如何在 Android Studio 中创建 jar 库的基础知识 我跟着如何从 Android Studio 项目中生成 jar https stackoverflow com a 21713954 3022836 and
  • Dagger 2 基类注入

    在 Dagger 1 中 我有一个基类设置 以便它可以处理创建作用域图并将依赖项注入当前对象 例如 public abstract class MyBaseActivity extends Activity private ObjectGr
  • 如何查看通道消费者引发的异常

    我开始使用django channels我觉得这太棒了 然而 调试消费者是痛苦的 因为当消费者内部引发一些异常时 没有任何内容打印到终端 websocket 只是断开连接 未显示的异常类型不易识别 系统地情况是这样的AssertionErr