当前位置: 首页 > 知识库问答 >
问题:

python捕获的异常仍在上升

齐胜涝
2023-03-14

这是我第一次问有关stackoverflow的问题。对不起,我的英语很差,英语不是我的母语。

我写了这样一个try/except条款:

try:
    hostname = result["hostname"]
except Exception as e:
    logger.error(e)
    return {"retcode":1,"description":e}

当结果中没有“主机名”键时,它会出现一个KeyError异常。当我运行我的代码时,我看到异常已经被捕获,因为logger.error(e)在我的日志文件中放置了一个日志。但是它仍然引发了一个异常,没有返回这个{“retcode”: 1,“描述”:“失败”}。

异常信息如下所示:

Traceback (most recent call last):
  File "/home/claire/myflask/venv/lib/python3.5/site-packages/flask/app.py",              line 1612, in full_dispatch_request
  rv = self.dispatch_request()
  File "/home/claire/myflask/venv/lib/python3.5/site-packages/flask/app.py", line 1598, in dispatch_request
  return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/claire/myflask/venv/lib/python3.5/site-packages/flask_restful/__init__.py", line 484, in wrapper
  return self.make_response(data, code, headers=headers)
  File "/home/claire/myflask/venv/lib/python3.5/site-packages/flask_restful/__init__.py", line 513, in make_response
  resp = self.representations[mediatype](data, *args, **kwargs)
  File "/home/claire/myflask/venv/lib/python3.5/site-packages/flask_restful/representations/json.py", line 21, in output_json
  dumped = dumps(data, **settings) + "\n"
  File "/usr/lib/python3.5/json/__init__.py", line 230, in dumps
  return _default_encoder.encode(obj)
  File "/usr/lib/python3.5/json/encoder.py", line 198, in encode
  chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python3.5/json/encoder.py", line 256, in iterencode
  return _iterencode(o, 0)
  File "/usr/lib/python3.5/json/encoder.py", line 179, in default
  raise TypeError(repr(o) + " is not JSON serializable")
  TypeError: KeyError('hostname',) is not JSON serializable

我正在使用Python 3.5.2和Flask 0.12.2和Flask-RESTful 0.3.6。此代码位于flask restful API中。完整的代码如下:

itf。py

import json
import requests
import time
import os,sys,re
import subprocess
import docker

def dosomething():
    do something.....
    return result    //result is a json.

api.py

from flask_restful import Resource, reqparse
from .mylogger import logger
from itf import dosomething

class TheRestAPI(Resource):
    def get(self, param):
        result = dosomething(param)

        try:
            hostname = result["hostname"]
        except Exception as e:
            logger.error(e)
            return {"retcode":1,"description":e}

        do other things .....
        return {"retcode":0,"description":"success"}

当我使用get请求调用此restAPI时,我得到以下响应:

{"message": "Internal Server Error"}

我不知道为什么它在这里执行“logger.error(e)”,但不返回下一条语句,以及为什么我使用“Exception as e”无法捕获KeyError异常。

然后我试了一下:

try:
    hostname = result["hostname"]
except Exception as e:
    logger.error(e)
    logger.error(str(type(e)))
    return {"retcode":1,"description":"failed"}
except KeyError as e:
    logger.info("second except.......")
    return {"retcode":1,"description":"failed"}
except TypeError as e:
    logger.info("third except.......")
    return {"retcode":1,"description":"failed"}

仍然无法捕获KeyError异常。

这是我的记录器模块:

import sys
import logging
from logging.handlers import RotatingFileHandler


LOG_PATH_FILE = '%s/app/agent.log'%sys.path[0]
LOG_MODE = 'a'
LOG_MAX_SIZE = 1*1024*1024 # 1M per file
LOG_MAX_FILES = 4
LOG_LEVEL = logging.INFO
LOG_FORMAT = "%(asctime)s %(levelname)-10s[%(filename)s:%(lineno)d(%(funcName)s)] %(message)s"

handler = RotatingFileHandler(LOG_PATH_FILE, LOG_MODE, LOG_MAX_SIZE, LOG_MAX_FILES)
formatter = logging.Formatter(LOG_FORMAT)
handler.setFormatter(formatter)

logger = logging.getLogger()

logger.setLevel(LOG_LEVEL)
logger.addHandler(handler)

共有1个答案

骆昊阳
2023-03-14

回溯中没有KeyError而是TypeError。

你没有定制的记录器吗。错误函数?还是自定义格式化程序?

错误来自此行imho

 类似资料:
  • 问题内容: 我想捕获一个特定的ValueError,而不仅仅是任何ValueError。 我试过这样的事情: 但这会引发SyntaxError:无法分配给文字。 然后我尝试了: 但这引发了例外,即使这是我要避免的例外。 问题答案: 在,是例外,而不是字符串的实例。因此,当您测试不等于特定字符串时,该测试始终为False。尝试: 代替。 例: 通常,如果可以帮助您,您并不是真的希望依赖于错误消息-这

  • 我正在启动一个Java程序,如下所示 然后我手动附加调试器,如下所示 我想知道是否有反正我设置jdb,使其自动附加到正在运行的进程(仅)在未捕获的异常情况下? 原因是我希望在出现未捕获的异常之前避免调试器的开销。但我现在面临的问题是,如果没有连接调试器,那么一旦出现未捕获的异常,JVM就会中止。 编辑: 从Oracle文档来看,下面的命令似乎满足了我的需要,但适用于windows机器。 有人知道l

  • 问题内容: 如何获得在Python中引发的异常的名称? 例如, 例如,我正在捕获多个(或所有)异常,并想在错误消息中打印异常的名称。 问题答案: 以下是获取异常类名称的几种不同方法: 例如,

  • 问题内容: 我正在为Android开发Java应用程序,目前遇到了一个问题,调试器正在进入catch块,并且ex为何为null?有人看过这样的东西吗? 问题答案: 这听起来像源代码,并且编译的类不同步,因此调试器正在进入错误的块。 尝试进行清理,然后进行重建。