azure_functions_worker/utils/tracing.py (26 lines of code) (raw):
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
import traceback
from traceback import StackSummary, extract_tb
from typing import List
def extend_exception_message(exc: Exception, msg: str) -> Exception:
# Reconstruct exception message
# From: ImportModule: no module name
# To: ImportModule: no module name. msg
old_tb = exc.__traceback__
old_msg = getattr(exc, 'msg', None) or str(exc) or ''
new_msg = (old_msg.rstrip('.') + '. ' + msg).rstrip()
new_excpt = type(exc)(new_msg).with_traceback(old_tb)
return new_excpt
def marshall_exception_trace(exc: Exception) -> str:
stack_summary: StackSummary = extract_tb(exc.__traceback__)
if isinstance(exc, ModuleNotFoundError):
stack_summary = _marshall_module_not_found_error(stack_summary)
return ''.join(stack_summary.format())
def _marshall_module_not_found_error(tbss: StackSummary) -> StackSummary:
tbss = _remove_frame_from_stack(tbss, '<frozen importlib._bootstrap>')
tbss = _remove_frame_from_stack(
tbss, '<frozen importlib._bootstrap_external>')
return tbss
def _remove_frame_from_stack(tbss: StackSummary,
framename: str) -> StackSummary:
filtered_stack_list: List[traceback.FrameSummary] = \
list(filter(lambda frame: getattr(frame,
'filename') != framename, tbss))
filtered_stack: StackSummary = StackSummary.from_list(filtered_stack_list)
return filtered_stack