这是我第一次问有关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)
回溯中没有KeyError而是TypeError。
你没有定制的记录器吗。错误函数?还是自定义格式化程序?
错误来自此行imho
比这快吗?
问题内容: 我想捕获一个特定的ValueError,而不仅仅是任何ValueError。 我试过这样的事情: 但这会引发SyntaxError:无法分配给文字。 然后我尝试了: 但这引发了例外,即使这是我要避免的例外。 问题答案: 在,是例外,而不是字符串的实例。因此,当您测试不等于特定字符串时,该测试始终为False。尝试: 代替。 例: 通常,如果可以帮助您,您并不是真的希望依赖于错误消息-这
我正在启动一个Java程序,如下所示 然后我手动附加调试器,如下所示 我想知道是否有反正我设置jdb,使其自动附加到正在运行的进程(仅)在未捕获的异常情况下? 原因是我希望在出现未捕获的异常之前避免调试器的开销。但我现在面临的问题是,如果没有连接调试器,那么一旦出现未捕获的异常,JVM就会中止。 编辑: 从Oracle文档来看,下面的命令似乎满足了我的需要,但适用于windows机器。 有人知道l
问题内容: 如何获得在Python中引发的异常的名称? 例如, 例如,我正在捕获多个(或所有)异常,并想在错误消息中打印异常的名称。 问题答案: 以下是获取异常类名称的几种不同方法: 例如,
问题内容: 我正在为Android开发Java应用程序,目前遇到了一个问题,调试器正在进入catch块,并且ex为何为null?有人看过这样的东西吗? 问题答案: 这听起来像源代码,并且编译的类不同步,因此调试器正在进入错误的块。 尝试进行清理,然后进行重建。