Пример #1
0
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
Пример #2
0
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)
    }