2011-08-18 5 views
20

첫째, 필자의 접근 방식이 적절한 지 잘 모르겠다. 그래서 나는 다양한 제안을한다.자주 반복되는 try/except in Python

try/except 문이 코드에서 자주 반복되는 경우이를 단축하거나 완전히 쓰지 않는 것이 좋습니다.

try: 
    # Do similar thing 
    os.remove('/my/file') 
except OSError, e: 
    # Same exception handing 
    pass 

try: 
    # Do similar thing 
    os.chmod('/other/file', 0700) 
except OSError, e: 
    #Same exception handling 
    pass 

예를 들어, 하나의 선 행동에 대한 당신은 예외 처리 래퍼를 정의한 다음 람다 함수 전달할 수 :

def may_exist(func): 
    "Work with file which you are not sure if exists.""" 
    try: 
     func() 
    except OSError, e: 
     # Same exception handling 
     pass 

may_exist(lambda: os.remove('/my/file')) 
may_exist(lambda: os.chmod('/other/file', 0700)) 

이 '솔루션은 그냥 일이 덜 명확하게 하는가를? 방금 try/except 문을 모두 써야하나요?

+0

[파이썬? : 예외 처리 표현으로]의 중복 가능성 (http://stackoverflow.com/questions/7088009/python-try-except-as -an-expression) – agf

+0

Me와 @kindall은 어제이 질문에 매우 답했습니다. – agf

+0

@agf :이 질문은 부분적으로 관련이있는 것 같습니다. 링크 해 주셔서 감사합니다. 그러나 Ned Batchelder의 대답은 예외를 잡을 필요가있는 코드 블록에서 기능을 만들 필요가 없다는 장점이있는 것으로 보입니다. – sutre

답변

24

처럼 가장 좋은 방법은 기능과 인수를 전달 권하고 싶습니다 것은 컨텍스트 매니저입니다 각 common_handling 블록에 완전한 문과 그 중 하나 이상을 넣을 수 있다는 이점이 있습니다.

동일한 처리를 반복해서 사용해야하는 경우 예외 처리가 많은 것처럼 느껴집니다. 이 작업을 많이 수행해야합니까?

+0

나는 이것을 정확히 내가 생각한 것 같지만, 예외를 과도하게 처리 할 수도있다. 이 경우에는 파일이있는 경우에만 작업하고 싶습니다. 나는 그들이 미리 (os.path.filexists) 존재 하는지를 확인할 수 있었지만, 내가 이해하는 것으로부터, 파이썬에서 예외를 잡으려고 시도하는 것이 더 낫다. – sutre

+0

그런 경우 * first * 예외를 catch 한 다음 해당 파일과 관련없는 전체 문장 블록을 건너 뛰고 나머지 작업의 나머지 예외는 모두 전파하도록 할 수 있습니다. 처음에는 예외가 없었고 두 번째 예외는 예외 였을 가능성은 거의 없습니다. – SingleNegationElimination

+0

@TokenMacGuy : 감사합니다. 나는 그 일을하는 가장 좋은 방법이 무엇인지 살펴볼 것입니다. – sutre

2

제네릭 솔루션이 좋다고 생각하지만 바닥에있는 람다를 사용하지 않을 것입니다.

from contextlib import contextmanager 
@contextmanager 
def common_handling(): 
    try: 
     yield 
    finally: 
     # whatever your common handling is 

다음 :

with common_handling(): 
    os.remove('/my/file') 

with common_handling(): 
    os.chmod('/other/file', 0700) 

이것은이 나는 추상적 인 예외 처리이

def may_exist(func, *args): 
    "Work with file which you are not sure if exists.""" 
    try: 
     func(args) 
    except OSError, e: 
     # Same exception handling 
     pass 

may_exist(os.remove, '/my/file') 
may_exist(os.chmod, '/other/file', '0700') 
4

아마 may_exist에게 장식하기 위해 청소기 될 것이다 : 다음

from functools import wraps 
def may_exist(func): 
    @wraps(func): 
    def wrapper(*args, **kwds): 
     try: 
      return func(*args, **kwds) 
     except OSError: 
      pass 
    return wrapper 

을 수행 할 수 있습니다 중 하나를 수행합니다 일회성 호출

may_exist(os.remove)('/my/file') 
may_exist(os.chmod)('/other/file', 0700) 

, 또는 :

remove_if_exists = may_exist(os.remove) 
... 
remove_if_exists('somefile') 

많이 사용하는 경우

1
이 작품 같은

겠습니까 뭔가 :

def may_exist(func, *func_args): 
    try: 
     func(*func_args) 
    except OSError as e: 
     pass