이 finally
절에서 발생합니다.이 절은 ctypes를 통해 사용되는 외부 라이브러리에서 유래 했으므로 아무 것도 할 수 없습니다. 사실 스크립트는 어쨌든 끝났기 때문에이 세그 폴트는 신경 쓰지 않습니다.finally 절의 파이썬 예외는 이전 예외를받습니다.
그러나 마지막으로 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"
내가 그것에 대해 어떻게 할 수 있다고 생각하십니까? 외부 라이브러리를 수정하는 것은 옵션이 아닙니다. 세그먼트 오류가 예외가 아니다, 그래서 당신은 다른 뭔가를 찾고 될 수 있습니다 말했다
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이 옳다 :
segfault는 '예외'가 아닙니다. 이것은 OS가 프로그램을 죽이게하는 신호가 아니라 'except'블록에서 잡을 수있는 신호가 아닙니다. segfault가 작성되기 전에 버퍼링 된 것을 확인하고 싶다면'sys.stdout.flush(); sys.stderr.flush()'를 실행하십시오. segfault 앞에 예외를 잡아서 기록하려면 'finally'앞에 'except' 블록을 넣고 기록하십시오. 니가 다른 것을 원한다면 ... 뭘 원하는거야? – abarnert
만약 내가'sys.stdout.flush(); sys.stderr.flush()'를 호출하면'Name Exception '("segfault here")'여전히'NameError'가 표시되지 않습니다. 내가 원하는 것 :'finally' 절에서 일어나는 어떤 것보다 먼저 발생하는 예외를 보아라. – mknaf
음, 네, 그것은'NameError'가 아직 인쇄되지 않았기 때문입니다. 일반적인 exit-interpreter-uncaught-exception 예외의 일부로 인쇄됩니다. 그런 식으로 끝내지 않으면 다른 방법으로 인쇄해야합니다. (EOL의 샘플에서와 같이) – abarnert