2013-02-27 5 views
2

В моем реальном случае 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" 

Как вы думаете, что я могу с этим поделать? Исправление внешней библиотеки не является вариантом.

+1

Segfault не является «Исключением»; это сигнал, который заставляет ОС убивать вашу программу, а не то, что вы можете поймать в блоке 'except'. Если вы просто хотите убедиться, что что-то буферизовано до написания segfault, вы можете попробовать 'sys.stdout.flush(); sys.stderr.flush() 'перед строкой, которая может segfault. Если вы хотите поймать и зарегистрировать исключение перед segfault, поставьте блок 'except' перед' finally', чтобы его зарегистрировать. Если вы хотите что-то еще ... чего вы хотите? – abarnert

+0

Если я поставлю 'sys.stdout.flush(); sys.stderr.flush() 'перед' raise Exception ("segfault here") 'он все еще не показывает' NameError'. Что я хочу: см. Любые Исключения, возникающие перед тем, что происходит в разделе 'finally' – mknaf

+0

Ну, это потому, что' NameError' еще не напечатан. Он печатается как часть обычного исключения exit-interpreter-through-uncaught-exception. Если вы не выходите из этого пути, вам нужно напечатать его каким-либо другим способом. (Как в примере EOL.) – abarnert

ответ

3

Вы можете попытаться поймать исключения, прежде чем ваш, наконец:

try: 
    f1() 
except NameError as error: # Change as needed 
    print "Error caught:", error # Or simply "raise", in order to raise the error caught 
finally: 
    raise Exception("segfault here") 
    print "finally" 

Это говорит, abamert прав: ошибка сегментации не является исключением, так что вы могли бы искать что-то другое.

+0

Было бы лучше показать, например, 'except Exception as e:', а затем код, который выдает что-то на основе 'e', а не только комментарии. – abarnert

+0

Между тем, я все еще не на 100% понимаю, чего хочет OP, но если он просто хочет увидеть что-то о 'NameError', прежде чем segfault в' finally' убьет его переводчика, это именно то, как это сделать , – abarnert

+0

@abamert: Я привел явный пример. – EOL