Python Lambda返回非JSON异常对象作为响应的报错问题咨询
问题根因
Python原生的json模块默认仅支持序列化字符串、数值、列表、字典、布尔值、None等基础类型,异常类的实例不属于可直接序列化的类型,因此直接对ex执行json.dumps()会抛出类型错误;而直接将异常对象作为body返回也不符合Lambda响应格式要求(body需为字符串类型)。
可行解决方案
方案1:仅返回异常提示信息(最简单)
将异常对象转为字符串后再序列化,可直接获取异常的核心提示内容:
import json def handler(event, context): try: project = event['environment'] except Exception as ex: return { 'statusCode': 500, 'body': json.dumps({"error": str(ex)}) }
方案2:返回完整异常堆栈信息(适合调试场景)
如果需要保留完整的错误栈方便排查问题,可以使用traceback模块捕获堆栈信息后序列化:
import json import traceback def handler(event, context): try: project = event['environment'] except Exception as ex: return { 'statusCode': 500, 'body': json.dumps({ "error_type": type(ex).__name__, "error_msg": str(ex), "stack_trace": traceback.format_exc() }) }
方案3:自定义JSON编码器(适配通用序列化场景)
如果有大量需要序列化异常对象的场景,可以自定义JSON编码器统一处理异常类型:
import json from json import JSONEncoder class ExceptionEncoder(JSONEncoder): def default(self, o): if isinstance(o, Exception): return { "error_type": type(o).__name__, "error_msg": str(o) } return super().default(o) def handler(event, context): try: project = event['environment'] except Exception as ex: return { 'statusCode': 500, 'body': json.dumps(ex, cls=ExceptionEncoder) }
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

