2011-10-07 5 views
3

예외 작업이 수행되어야하는 모든 작업 (예외가 발생하는 경우)이 아니라면 파일을 삭제해야합니다. 을 사용하는 것만 큼 간단하고 파일을 삭제 한 다음 예외를 다시 제기 할 수 있지만 그럴 경우 어떤 이유에서든지 을 제외한 파일을 삭제할 수없는 경우 원래 예외가 사라집니다. .예외가 발생한 경우에만 개체 정리

내가 가지고 올 수 있었다 그 가장은 이것이다 :

try: 
    file_path = "whatever.jpg" 
    # do stuff with file 
except: 
    exception_raised = True 
    raise 
finally: 
    try: 
     if exception_raised: 
      os.unlink(file_path) 
    except: 
     pass 

return file_path # everything OK 

는 사람이 더 나은, 더 파이썬 방법을 알고 있나요?

답변

5

또 다른 옵션은 당신이 그것을 잃고 싶지 않으면 단순히 예외를 저장하는 것입니다 :

파이썬 3.x의 버전 :

try: 
    file_path = "whatever.jpg" 
    # do stuff with file 
except BaseException as e: 
    try: 
     os.unlink(file_path) 
    except Exception: 
     traceback.print_exc() 
    raise e 

파이썬 2.X 버전이 약간 더 복잡한 이후입니다 수동으로 완전한 예외 정보를 저장해야합니다 (그렇지 않으면 당신은 역 추적을 잃을 것) :

try: 
    file_path = "whatever.jpg" 
    # do stuff with file 
except: 
    e = sys.exc_info() 
    try: 
     os.unlink(file_path) 
    except Exception: 
     traceback.print_exc() 
    raise e[0], e[1], e[2] 

편집을 : 만 캐치 서브 클래스가 Exception이고, 내부가 try 블록인데, 여기서는 SystemExit 또는 KeyboardInterrupt을 catch하지 않으려 고합니다. 또한 링크를 해제하는 대신 링크 해제 중 발생한 모든 증상을보고하십시오.

+0

물론 이것은 'BaseException'에서 파생되지 않은 예외에 대해서는 작동하지 않습니다. – Mankarse

+0

@Mankarse : Python 3에서 모든 예외는 BaseException에서 파생되어야합니다. Python 2에서 예외 클래스는 'BaseExcpetion'에서 파생되거나 구식 클래스 여야합니다. 올드 스타일 클래스는 10 년 동안 단계적으로 사라져 가고 있기 때문에 이상한 예외 클래스를 사용하는 * 아주 * 오래된 라이브러리를 사용하지 않는다면 위의 코드는 매우 안전해야합니다. –

+0

@Mankarse : Python 2.x의 코드에 다른 문제가있었습니다. 예외의 추적을 잃었습니다. 이 문제를 해결하면 (부전공) 제한이 'BaseException'으로 제거되었습니다. –

관련 문제