2010-03-04 4 views
3

더 나은 str 오류를 처리하기 위해 예외를 발생시키는 사람을 식별해야합니다. 방법이 있습니까? 내 예에서파이썬에서 어떤 함수 호출이 예외를 발생시키는 지 확인하는 방법은 무엇입니까?

보기 :

try: 
    os.mkdir('/valid_created_dir') 
    os.listdir('/invalid_path') 
except OSError, msg: 

    # here i want i way to identify who raise the exception 
    if is_mkdir_who_raise_an_exception: 
     do some things 

    if is_listdir_who_raise_an_exception: 
     do other things .. 

내가 파이썬에서,이 문제를 해결할 수있는 방법?

답변

8

, 더 좋을 수도 있습니다 (첫 번째 부분이 실패한 경우 두 번째 부분을 생략해야 할 수도 있음).

두 가지 경우 모두해야 할 일이 많고 어떤 기능이 실패했는지에 따라 약간의 작업 만 수행하면 분리하면 많은 중복과 반복이 발생하여 제안한 양식이 잘 될 수 있습니다 선택할 만한. 파이썬의 표준 라이브러리의 traceback 모듈은이 경우에 도움이 될 수 있습니다

import os, sys, traceback 

try: 
    os.mkdir('/valid_created_dir') 
    os.listdir('/invalid_path') 
except OSError, msg: 
    tb = sys.exc_info()[-1] 
    stk = traceback.extract_tb(tb, 1) 
    fname = stk[0][2] 
    print 'The failing function was', fname 

대신 물론 print 당신이 처리 할 정확히 결정 if 검사를 사용합니다.

+0

+1하지만 실패한 함수를 반환하는 stk [0] [3]은 아닙니까? – luc

+0

@luc, 가능하다면 소스가됩니다. http://docs.python.org/library/traceback.html?highlight=traceback#traceback.extract_tb에서 문서 인용하기, ""사전 처리 된 "스택 추적 항목은 4 배가됩니다."(파일 이름, 행 번호, 함수 이름, 텍스트)'스택 추적을 위해 보통 인쇄되는 정보를 나타내는 텍스트입니다. 텍스트는 앞뒤 공백이 제거 된 문자열이고, 소스를 사용할 수없는 경우 없음입니다. "" "function_name은 튜플의 인덱스 2에서. –

+0

try/except, try/except 솔루션이 더 좋을 수도 있지만, 제 경우에는 어떤 함수가 예외를 발생시켜야합니까? 그래서이 대답은 저에게 최고의 답입니다! 고마워요 :) –

8

각 기능을 개별적으로 "try/catch"로 둘러 쌉니다.

try: 
    os.mkdir('/valid_created_dir') 
except Exception,e: 
    ## doing something, 
    ## quite probably skipping the next try statement 

try: 
    os.listdir('/invalid_path') 
except OSError, msg: 
    ## do something 

어쨌든 가독성/이해력을 높이는 데 도움이됩니다.

+0

세부 사항에 따라 두 번째 try ... except는 첫 번째 블록의 else : 블록으로 이동할 수 있습니다. –

+1

이것은 논리를 약간 변경합니다. 디렉토리가 이미 존재하기 때문에'mkdir '이 실패하면'listdir'을 무의도로 시도합니다. –

+0

물론 나는 전체적인 해결책을 만들어 내지 못했습니다. 단지 원리 일뿐입니다. – jldupont

1

어떻게 간단한 솔루션에 대해 :

이 기능은 코드가 기존 답변 제안으로 다음/간부 블록을 시도 분리, 보여 보인다 실패에 따라 실행할 수있는 완전히 분리 작업이있는 경우
try: 
    os.mkdir('/valid_created_dir') 
except OSError, msg: 
    # it_is_mkdir_whow_raise_ane_xception: 
    do some things 

try: 
    os.listdir('/invalid_path') 
except OSError, msg:  
    # it_is_listdir_who_raise_ane_xception: 
    do other things .. 
0

여기에 깨끗한 방법입니다 : 그런 일이 예외에 추가 정보를 첨부하고 통합 된 장소에 사용

실제로
import os, sys 
def func(): 
    try: 
     os.mkdir('/dir') 
    except OSError, e: 
     if e.errno != os.errno.EEXIST: 
      e.action = "creating directory" 
      raise 

    try: 
     os.listdir('/invalid_path') 
    except OSError, e: 
     e.action = "reading directory" 
     raise 

try: 
    func() 
except Exception, e: 
    if getattr(e, "action", None): 
     text = "Error %s: %s" % (e.action, e) 
    else: 
     text = str(e) 
    sys.exit(text) 

, 당신은 MKDIR 같은 기능에 대해 래퍼를 만들고 싶어하고 작은 try/except 블록을 코드 전체에 뿌리기보다는 이것을 수행하고 싶다면 listdir.

일반적으로 오류 메시지에서이 정도 수준의 세부 정보를 찾지 못하므로 (파이썬 메시지는 일반적으로 많음)이 방법을 사용하는 것이 좋습니다.

관련 문제