2012-06-27 2 views
4

Это атрибуты для исключений Python, но у меня возникают проблемы с обволакиванием вокруг них. Документация Python кажется довольно спокойной. Я взглянул на documentation, но довольно смущен. Итак, в чем разница между ними и как они используются?В чем разница между __cause__ и __context__?

EDIT: На этой ноте, как они связаны с __traceback__, если вообще?

EDIT 3: Я думаю, что я просто не понимаю __cause__. Я наконец понял __traceback__ и __context__. Почему attribute_error.__cause__ не относится к AttributeError()?

try: 
    raise NameError() from OSError 
except NameError as name_error: 
    print('name_error.__cause__: %s' % repr(name_error.__cause__)) 
    print('name_error.__context__: %s' % repr(name_error.__context__)) 
    print('name_error.__traceback__: %s' % repr(name_error.__traceback__)) 
    try: 
     raise AttributeError() 
    except AttributeError as attribute_error: 
     print('attribute_error.__cause__: %s' % repr(attribute_error.__cause__)) 
     print('attribute_error.__context__: %s' % repr(attribute_error.__context__)) 
     print('attribute_error.__traceback__: %s' % repr(attribute_error.__traceback__)) 
     raise attribute_error from IndexError 

Это выводит

name_error.__cause__: OSError() 
name_error.__context__: None 
name_error.__traceback__: <traceback object at 0x000000000346CAC8> 
attribute_error.__cause__: None 
attribute_error.__context__: NameError() 
attribute_error.__traceback__: <traceback object at 0x000000000346CA88> 
Traceback (most recent call last): 
    File "C:\test\test.py", line 13, in <module> 
    raise attribute_error from IndexError 
    File "C:\test\test.py", line 8, in <module> 
    raise AttributeError() 
AttributeError 
+1

Документ тонкий, потому что это более или менее внутренние переменные, о которых большинство питонов не знает. Причиной упоминания их вообще является: а) они видны и б) люди, которые поймают одну ошибку и поднимут другую, возможно, должны знать. –

ответ

6

__cause__ является причиной, за исключение - из-за данное исключение, было поставлено текущее исключение. Это прямая ссылка - X выбрал это исключение, поэтому Y должен выбросить это исключение.

__context__, с другой стороны, означает, что текущее исключение было поднято при попытке обработать другое исключение и определяет исключение, которое было обработано в то время, когда оно было поднято. Это так, что вы не потеряете тот факт, что другие исключения произошли (и, следовательно, были в этом коде, чтобы исключить исключение) - контекст. X бросил это исключение, обрабатывая его, Y также был выброшен.

__traceback__ показывает вам стек - различные уровни функций, которые выполнялись, чтобы перейти к текущей строке кода. Это позволяет определить, что вызвало исключение. Вероятно, он будет использоваться (потенциально в тандеме с __context__), чтобы найти причину данной ошибки.

+0

Я * думаю * Я начинаю это получать. Не возражаете ли вы предоставить краткий фрагмент кода, демонстрирующий, что каждый из них находится в каждом месте в коде? –

+0

@TylerCrompton Какой код? –

+0

Проверьте мои изменения. –

Смежные вопросы