2014-04-26 4 views
0

나는 CRTL+C가 다른 코드와 예외의 나머지 부분을 처리 할 뿐이다 누를 때 파이썬 스크립트를 일시 정지 할 수 있습니다. 키보드는 예외 있어야 방해하지파이썬에서 여러 예외를 처리합니까?

except KeyboardInterrupt: 
    print '\nPausing... (Hit ENTER to continue, type quit to exit.)' 
    try: 
     response = raw_input() 
     if response == 'quit': 
      break 
     print 'Resuming...' 
    except KeyboardInterrupt: 
     print 'Resuming...' 
     continue   

except Exception, e: 
    print traceback.print_exc() 
    continue 
    sleep(170) 

except초되지는 KeyboardInterrupt을 위해 또한 갈 것입니다 : 내가 가진 경우

?

답변

1

KeyboardInterrupt를 제외하고는 두 번째가 아니라 키보드 인터럽트가 예외로 간주 되나요?

음,이 ... 흥미로운 것은 분명히 그것은 하지예외 클래스의 서브 클래스입니다 만, BaseException라는 슈퍼 클래스에 아이입니다.

예외가 수 있도록이 실수로 예외를 잡는다 때문에 종료에서 인터프리터를 방지 코드에 의해 잡힐하지 BaseException에서 상속 : 그들은 이런 식으로 구현 이유

파이썬의 문서는 Built-in Exceptions 설명합니다.

그리고는 다음과 같이 확인할 수 있습니다 :

그럼에도 불구하고
>>> issubclass(KeyboardInterrupt, Exception) 
False 
>>> issubclass(KeyboardInterrupt, BaseException) 
True 
>>> issubclass(Exception, BaseException) 
True 

, 당신은 블록을 제외하고 마지막 변경된 경우에도 BaseException 대신 예외을 잡기 위해, 그것은 여전히를 입력하지 않을 (내부의 except KeyboardInterrupt은 예외를 외부 들여 쓰기 또는 "부모"수준에 던지지 않으므로). 당신이 내부 except KeyboardInterrupt 블록을 제거 할 경우

는, 예외는 ... 나는 그것이 (당신의 들여 쓰기 수준 부여) 및 실행이 종료 것이 존재하지 않는 가정 외부 들여 쓰기에 던져

+0

위대한 문서화 할 것 , 당신은 파이썬 교수 다 :) – diegoaguilar

관련 문제