Как я могу изменить Python traceback объект при повышении исключения?

Здесь вы идете:

def carry_concat(string_list):
    replacement = ""  # current replacement string ("when" or "who" or whatever)
    replaced_list = []  # the new list
    for value in string_list:
        if value[0] == "#":
            # add string with replacement
            replaced_list.append(replacement + " " + value[1:])
        else:
            # set this string as the future replacement value
            replacement = value
            # add string without replacement
            replaced_list.append(value)
    return replaced_list

a = ['when', '#i am here','#go and get it', '#life is hell', 'who', '#i am here','#go and get it',]

print(a)
print(carry_concat(a))

Это печатает:

['when', '#i am here', '#go and get it', '#life is hell', 'who', '#i am here', '#go and get it']
['when', 'when i am here', 'when go and get it', 'when life is hell', 'who', 'who i am here', 'who go and get it']
21
задан Josh Lee 14 June 2013 в 15:43
поделиться

3 ответа

Как насчет того, чтобы не менять трассировку? Две вещи, которые вы запрашиваете, можно упростить другим способом.

  1. Если исключение из библиотеки перехвачено в коде разработчика и вместо него возникает новое исключение, исходная трассировка, конечно, будет отброшена. Вот как обычно обрабатываются исключения ... если вы просто разрешите генерировать исходное исключение, но измените его, чтобы удалить все "верхние" кадры, фактическое исключение не будет иметь смысла, поскольку последняя строка в трассировке не будет сам может вызвать исключение.
  2. Чтобы вырезать последние несколько кадров, вы можете запросить сокращение ваших трассировок ... такие вещи, как traceback.print_exception (), принимают параметр «limit», который вы можете использовать для пропуска последние несколько записей.

Тем не менее, должно быть вполне возможно изменить трассировку, если вам действительно нужно ... но где бы вы это сделали? Если в некотором коде оболочки на самом верхнем уровне, вы можете просто захватить трассировку, взять фрагмент, чтобы удалить части, которые вам не нужны, а затем использовать функции в модуле «трассировки» для форматирования / печати по желанию.

2
ответ дан 29 November 2019 в 21:41
поделиться

Для python3 вот мой ответ. Прочитайте комментарии для объяснения:

def pop_exception_traceback(exception,n=1):
    #Takes an exception, mutates it, then returns it
    #Often when writing my repl, tracebacks will contain an annoying level of function calls (including the 'exec' that ran the code)
    #This function pops 'n' levels off of the stack trace generated by exception
    #For example, if print_stack_trace(exception) originally printed:
    #   Traceback (most recent call last):
    #   File "<string>", line 2, in <module>
    #   File "<string>", line 2, in f
    #   File "<string>", line 2, in g
    #   File "<string>", line 2, in h
    #   File "<string>", line 2, in j
    #   File "<string>", line 2, in k
    #Then print_stack_trace(pop_exception_traceback(exception),3) would print: 
    #   File "<string>", line 2, in <module>
    #   File "<string>", line 2, in j
    #   File "<string>", line 2, in k
    #(It popped the first 3 levels, aka f g and h off the traceback)
    for _ in range(n):
        exception.__traceback__=exception.__traceback__.tb_next
    return exception
0
ответ дан 29 November 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: