2008-09-18 4 views
10

간단히 말해서, 필자는 Linux에서 "losetup", "mount"등의 아웃 콜을하는 실질적인 Python 응용 프로그램을 가지고 있습니다. 완료 될 때 해제해야하는 시스템 리소스를 소모합니다.응용 프로그램 전반의 예외 처리기가 의미가 있습니까?

내 응용 프로그램이 충돌하는 경우 이러한 시스템 리소스가 제대로 릴리스되도록하고 싶습니다.

다음과 같은 것을하는 것이 합리적입니까?

def main(): 
    # TODO: main application entry point 
    pass 

def cleanup(): 
    # TODO: release system resources here 
    pass 

if __name__ == "__main__": 
    try: 
     main() 
    except: 
     cleanup() 
     raise 

이것은 일반적으로 수행되는 것입니까? 더 좋은 방법이 있습니까? 아마도 싱글 톤 클래스의 소멸자입니까?

답변

11

나는 (언어에 관계없이) 일반적으로 최상위 예외 처리기를 좋아합니다. 예외를 throw하는 메서드 내에서 소비 된 리소스와 즉시 관련되지 않을 수있는 리소스를 정리하기에 좋은 곳입니다.

이러한 프레임 워크가있는 경우에도 로그의 환상적인 장소입니다. 최상위 레벨 핸들러는 계획하지 않은 이상한 예외를 잡아서 나중에 수정할 수있게합니다. 그렇지 않으면 전혀 알 수 없을 것입니다.

최상위 수준 처리기가 예외를 throw하지 않도록주의하십시오!

+0

최상위 예외 처리기는 GUI 응용 프로그램에서 유용합니다. 이벤트 핸들러에서 발생하는 잡히지 않은 예외는 콘솔에 표시되지만 일반적으로 프로그램을 중단시키지 않습니다 (예 : PyGTK 및 PyQt). 이는 눈에 띄지 않을 수 있습니다. 핸들러에 오류 대화 상자가 표시되면 그 문제점이 없습니다. –

+0

또한 일괄 처리를 수행하는 콘솔 앱에 넣는 것이 좋습니다. 나는 그들이 문제를 통보받을 수 있도록 이메일을 보내달라고하지만 최소한 그것은 기록 할 수있다. –

2

응용 프로그램의 와이드 핸들러가 좋습니다. 그들은 로깅에 좋습니다. 응용 프로그램 전체가 내구성이 있으며 충돌을 일으키지 않을 것입니다.

7

소멸자 (__del__ 메서드에서와 같이)는 호출 할 수 없으므로 나쁜 생각입니다. atexit 모듈은 파이썬 인터프리터가 파이썬 응용 프로그램보다 충돌하거나 os._exit()가 사용되거나 공격적으로 프로세스가 중단되거나 시스템이 재부팅되는 경우 여전히 작동하지 않지만 더 안전한 방법입니다. (물론 마지막 항목은 문제가되지 않습니다.) 프로세스가 충돌하기 쉬운 경우 (예를 들어 변덕스러운 제 3 자 확장 모듈을 사용하는 경우) 간단한 부모 프로세스에서 정리를 수행 할 수 있습니다. 더 고립.

걱정할 필요가 없다면 atexit 모듈을 사용하십시오.

+0

소멸자가 호출 될지 확실하지 않았습니다. 설명 주셔서 감사합니다! atexit이 필요한 것 같습니다. – EmmEff

1

그것은 합리적인 접근법처럼 보이며, 싱글 톤 클래스의 소멸자보다 더 간단하고 신뢰할 수 있습니다. "atexit"모듈을 볼 수도 있습니다. ("tex it"이나 그와 비슷한 것이 아니라.) 나는 오랫동안 혼란스러워했다.)

2

클래스를 사용한다면, 물론 소멸자에서 할당 한 자원을 해제해야한다. . 클래스의 소멸자가 이미 해제하지 않은 리소스를 해제하려는 경우 전체 애플리케이션에서 try :를 사용하십시오.

try: 
    main() 
finally: 
    cleanup() 

보다 파이썬 방법으로 정리를 보장합니다 :

그리고 대신 사용

캐치를 모두 다음과 같은 블록을 사용한다 :, 제외.

1

컨텍스트 관리자 작성 및 with 문 사용을 고려하십시오.

관련 문제