В моем реальном случае Segmentation fault
возникает в предложении finally
, о котором я ничего не могу сделать, потому что это связано с внешней библиотекой, используемой с помощью ctypes. На самом деле, я не забочусь об этом segfault, потому что сценарий все равно выполнен.Python Exception в последнем предложении ест предыдущие исключения
Однако segfault в конечном итоге ест все Исключения, которые происходят до него. Таким образом, отладка первой NameError
от iDontExist
становится болью в заднице. Это нигде не встречается. В настоящее время нет никакого способа увидеть какие-либо поднятые Исключения от segfault.
def f1():
try:
while True:
pass
except KeyboardInterrupt:
print iDontExist
if __name__=="__main__":
try:
f1()
finally:
raise Exception("segfault here")
print "finally"
Как вы думаете, что я могу с этим поделать? Исправление внешней библиотеки не является вариантом.
Segfault не является «Исключением»; это сигнал, который заставляет ОС убивать вашу программу, а не то, что вы можете поймать в блоке 'except'. Если вы просто хотите убедиться, что что-то буферизовано до написания segfault, вы можете попробовать 'sys.stdout.flush(); sys.stderr.flush() 'перед строкой, которая может segfault. Если вы хотите поймать и зарегистрировать исключение перед segfault, поставьте блок 'except' перед' finally', чтобы его зарегистрировать. Если вы хотите что-то еще ... чего вы хотите? – abarnert
Если я поставлю 'sys.stdout.flush(); sys.stderr.flush() 'перед' raise Exception ("segfault here") 'он все еще не показывает' NameError'. Что я хочу: см. Любые Исключения, возникающие перед тем, что происходит в разделе 'finally' – mknaf
Ну, это потому, что' NameError' еще не напечатан. Он печатается как часть обычного исключения exit-interpreter-through-uncaught-exception. Если вы не выходите из этого пути, вам нужно напечатать его каким-либо другим способом. (Как в примере EOL.) – abarnert