【问题标题】:Python catch custom warning class without stopping execution of codePython 在不停止执行代码的情况下捕获自定义警告类
【发布时间】:2021-10-18 23:25:52
【问题描述】:

我正在创建一个应用程序,它接收来自用户的命令,验证该命令是否合法,然后执行该命令。

基本流程是在用户发出请求时触发receive_message函数。然后,receive_message 函数将函数请求路由到正确的辅助函数,具体取决于用户请求执行的操作。

我要处理两种异常情况——错误和警告。当无法执行该操作时,应该会发生错误。警告应该在操作可行时出现,但可能不会按照用户预期的方式运行。

现在我通过在辅助函数中引发 CustomError 类来处理错误。例如,

circularity = is_circular_reference(column_id, reference)
if circularity:
  raise CustomError()

然后在 receive_message 函数中捕获该异常,该函数具有以下代码

try:
       self.handle_request(event)
       self.send({success: True})
         
except CustomError as e:
        print(get_recent_traceback())
        print(e)
        
        response = {
            'event': 'edit_error',
            'id': event['id'],
            'type': e.type_,
            'header': e.header,
            'to_fix': e.to_fix
        }
        
        self.send(response)

我希望能够以类似的方式处理CustomWarning,不同之处在于提高CustomWarning 不应停止函数的执行。当抛出警告时,整个self.handle_request(event) 应该完成执行,然后我应该捕获警告并将其发送回前端。

例如,我想检查是否应该以与检查错误类似的方式抛出警告:

warning_required = is_warning_required(column_id, reference)
if warning_required:
      raise CustomWarning()

然后我想扩展receive_message 函数,使其如下所示:

try:
       self.handle_request(event)
       self.send({success: True})
         
except CustomError as e:
        print(get_recent_traceback())
        print(e)
        
        response = {
            'event': 'edit_error',
            'id': event['id'],
            'type': e.type_,
            'header': e.header,
            'to_fix': e.to_fix
        }
        
        self.send(response)


except CustomWarning as w:
          response = {
                'event': 'edit_warning',
                'id': event['id'],
                'type': e.type_,
                'header': e.header,
                'warning_message': e.warning_message
            }

【问题讨论】:

  • 只要你raise,它就会中断当前的控制流,类似于return——调用者在except中做了什么并不重要。 handle_request 是需要改变的东西,而不是它的调用者。

标签: python error-handling


【解决方案1】:

您不能像这样推迟异常:它们的目的是允许流控制立即跳到最近的捕获异常的封闭try 语句。

您想要handle_request 简单地构建并返回适当的响应。

try:
    response = self.handle_request(event)
except CustomError as e:
    print(get_recent_traceback())
    print(e)

    response = { ... }

self.send(response)

其中handle_request 本身返回{"success": True}{"event": "edit_warning", ...}。一旦try 语句完成,response 将引用适当的值传递给self.send

【讨论】:

    猜你喜欢
    • 2016-05-26
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多