AWS Lambda 未显示 Python 3.8 中的异常堆栈跟踪原因

pko*_*out 7 amazon-web-services python-3.x aws-lambda

我使用运行时 Python 3.8 将以下代码部署到 AWS Lambda。

\n\n
try:\n    raise Exception(\'my exception\')\nexcept Exception as e:\n    raise ValueError(\'my exception 2\') from e\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 CloudWatch 中,我希望看到像这样的异常链:

\n\n
Traceback (most recent call last):\n  File "/var/task/handler.py", line 2, in <module>\n    raise Exception(\'my exception\')\nException: my exception\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File "/var/task/handler.py", line 4, in <module>\n    raise ValueError(\'my exception 2\') from e\nValueError: my exception 2\n
Run Code Online (Sandbox Code Playgroud)\n\n

相反,我只看到 CloudWatch 中报告的第一个异常,如下所示:

\n\n
[ERROR] ValueError: my exception 2\nTraceback (most recent call last):\n\xc2\xa0\xc2\xa0File "/var/task/handler.py", line 21, in pevm_import_budget_file\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0raise ValueError(\'my exception 2\') from e\n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么日志中没有显示direct cause该语句的异常?from

\n

Par*_*igm 7

你提到的行为是预期的,我也看到过同样的情况。看来 Lambda 目前不支持链式异常。但是,为了解决这个问题,您可以添加自己的记录器来捕获异常。

例如,使用traceback检索异常堆栈:

import traceback

def lambda_handler(event, context):
    try:
        try:
            raise Exception('my exception')
        except Exception as e1:
            raise ValueError('my exception 2')
    except Exception as e2:
        traceback.print_exception(type(e2), value=e2, tb=e2.__traceback__)

    return {}
Run Code Online (Sandbox Code Playgroud)

CloudWatch 日志如下所示:

Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 6, in lambda_handler
    raise Exception('my exception')
Exception: my exception

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 8, in lambda_handler
    raise ValueError('my exception 2')
ValueError: my exception 2
Run Code Online (Sandbox Code Playgroud)

  • 您必须小心使用 Traceback ,因为使用它会使 lambda 检测到执行失败并进行重试,这可能会导致某些双重调用问题。 (2认同)