def chained_exception(interface: ChainedException, event: Event, context: GroupingContext, **meta: Any) -> ReturnedVariants: # Case 1: we have a single exception, use the single exception # component directly to avoid a level of nesting exceptions = interface.exceptions() if len(exceptions) == 1: return context.get_grouping_component(exceptions[0], event=event, **meta) # Case 2: produce a component for each chained exception by_name: Dict[str, List[GroupingComponent]] = {} for exception in exceptions: for name, component in context.get_grouping_component(exception, event=event, **meta).items(): by_name.setdefault(name, []).append(component) rv = {} for name, component_list in by_name.items(): rv[name] = GroupingComponent( id="chained-exception", values=component_list, tree_label=calculate_tree_label(reversed(component_list)), ) return rv
def chained_exception_legacy(interface: ChainedException, event: Event, context: GroupingContext, **meta: Any) -> ReturnedVariants: # Case 1: we have a single exception, use the single exception # component directly exceptions = interface.exceptions() if len(exceptions) == 1: single_variant: GroupingComponent = context.get_grouping_component( exceptions[0], event=event, **meta) return {context["variant"]: single_variant} # Case 2: try to build a new component out of the individual # errors however with a trick. In case any exception has a # stacktrace we want to ignore all other exceptions. any_stacktraces = False values = [] for exception in exceptions: exception_component: GroupingComponent = context.get_grouping_component( exception, event=event, **meta) stacktrace_component = exception_component.get_subcomponent( "stacktrace") if stacktrace_component is not None and stacktrace_component.contributes: any_stacktraces = True values.append(exception_component) if any_stacktraces: for value in values: stacktrace_component = value.get_subcomponent("stacktrace") if stacktrace_component is None or not stacktrace_component.contributes: value.update(contributes=False, hint="exception has no stacktrace") return { context["variant"]: GroupingComponent(id="chained-exception", values=values) }