2013-02-27 6 views
2

finally 절에서 발생합니다.이 절은 ctypes를 통해 사용되는 외부 라이브러리에서 유래 했으므로 아무 것도 할 수 없습니다. 사실 스크립트는 어쨌든 끝났기 때문에이 세그 폴트는 신경 쓰지 않습니다.finally 절의 파이썬 예외는 이전 예외를받습니다.

그러나 마지막으로 segfault는 결국 모든 예외를 먹습니다. 따라서, 먼저 NameErroriDontExist에서 디버깅하는 것은 엉덩이의 고통이됩니다. 그것은 어디에서도 발생하지 않습니다. 현재 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이 옳다 :

+1

segfault는 '예외'가 아닙니다. 이것은 OS가 프로그램을 죽이게하는 신호가 아니라 'except'블록에서 잡을 수있는 신호가 아닙니다. segfault가 작성되기 전에 버퍼링 된 것을 확인하고 싶다면'sys.stdout.flush(); sys.stderr.flush()'를 실행하십시오. segfault 앞에 예외를 잡아서 기록하려면 'finally'앞에 'except' 블록을 넣고 기록하십시오. 니가 다른 것을 원한다면 ... 뭘 원하는거야? – abarnert

+0

만약 내가'sys.stdout.flush(); sys.stderr.flush()'를 호출하면'Name Exception '("segfault here")'여전히'NameError'가 표시되지 않습니다. 내가 원하는 것 :'finally' 절에서 일어나는 어떤 것보다 먼저 발생하는 예외를 보아라. – mknaf

+0

음, 네, 그것은'NameError'가 아직 인쇄되지 않았기 때문입니다. 일반적인 exit-interpreter-uncaught-exception 예외의 일부로 인쇄됩니다. 그런 식으로 끝내지 않으면 다른 방법으로 인쇄해야합니다. (EOL의 샘플에서와 같이) – abarnert

답변

3

당신은 당신의 마지막 전에 예외를 잡으려고 시도 할 수 있습니다.

+0

예를 들어 '예외를 제외한 예외 : e'를 표시 한 다음 주석 대신 'e'를 기반으로 무언가를 인쇄하는 코드를 사용하는 것이 좋습니다. – abarnert

+0

한편, 나는 아직도 OP가 원하는 것을 100 % 명확하게 밝히지는 못했지만, '마지막으로'의 세그 폴트가 그의 통역사를 죽이기 전에 'NameError'에 관해 뭔가를보고 싶다면, 이것은 정확하게 그것을하는 방법이다 . – abarnert

+0

@abamert : 나는 명백한 예를 든다. – EOL