The bootstrap.py wrapper's error logging doesn't correctly handle chained exceptions (see PEP-3134)
Example
Here's a simple example of code that uses chained exceptions. In that case, when the second exception is thrown, it will have a reference to the first exception stored in __cause__ field (basically, it's doing something like e2.__cause__ = e).
try:
raise Exception("first!")
except Exception as e:
raise Exception("second!") from e
When this code is executed, the error is printed like this.
Traceback (most recent call last):
File "/Users/piotr/dev/bazel-fun/python/src/logging_with_cause/test.py", line 83, in <module>
raise Exception("first!")
Exception: first!
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/Users/piotr/dev/bazel-fun/python/src/logging_with_cause/test.py", line 85, in <module>
raise Exception("second!") from e
Exception: second!
It includes:
first exception's message and stacktrace followed by
The above exception was the direct cause of the following exception:, followed by
second exception's message and stacktrace
Issue
When a chained exception is thrown inside Lambda however, it only prints second exception:
[ERROR] Exception: second!
Traceback (most recent call last):
File "/Users/piotr/dev/bazel-fun/python/src/logging_with_cause/test.py", line 81, in <module>
raise Exception("second!") from e
Expected result
The whole chain should be printed. Note - the chain can contain any number of exceptions, not only 2.
One option could be:
[ERROR] Exception: second!
Traceback (most recent call last):
File "/Users/piotr/dev/bazel-fun/python/src/logging_with_cause/test.py", line 81, in <module>
raise Exception("second!") from e
Caused by: Exception: first!
Traceback (most recent call last):
File "/Users/piotr/dev/bazel-fun/python/src/logging_with_cause/test.py", line 83, in <module>
raise Exception("first!")
...
Code that is responsible for logging exceptions is here.
The bootstrap.py wrapper's error logging doesn't correctly handle chained exceptions (see PEP-3134)
Example
Here's a simple example of code that uses chained exceptions. In that case, when the second exception is thrown, it will have a reference to the first exception stored in
__cause__
field (basically, it's doing something likee2.__cause__ = e
).When this code is executed, the error is printed like this.
It includes:
The above exception was the direct cause of the following exception:
, followed byIssue
When a chained exception is thrown inside Lambda however, it only prints second exception:
Expected result
The whole chain should be printed. Note - the chain can contain any number of exceptions, not only 2.
One option could be:
Code that is responsible for logging exceptions is here.