2013-06-26 2 views
1

프로세스에서 스크립트 종료 제어를 배치해야하는 곳이 궁금합니다.조건부 스크립트 종료 및 위임 제어

스크립트가 계속되어야하는지 여부를 결정하는 데 함수가 사용되는 경우 결과에 따라 호출자 또는 호출 수신자가 제어해야합니까?

시나리오가있을 수 있습니까?

(나는이 질문은 넓은 의미 그래서 프로그래밍에서 높은 수준의 연습에 대한 답변을 확장 주시기 바랍니다있다 확신합니다. 즉, 실제로 좋은 것)

내가 옵션으로 고려하는 아래의 몇 가지 예를 나열합니다 조건부 스크립트 종료 및 제어가 위임 될 수 있는지 여부

should_continue은 제공된 arg가 유효하고 스크립트가 계속 유효 함을 확인하고 있다고 가정합니다. 그렇지 않으면 종료됩니다.

''' 
ex 1: return state to parent process to determine if script continues 
''' 
def should_continue(bool): 
    if bool: 
    return True 
    else: 
    return False 

def init(): 
    if should_continue(True): 
    print 'pass' 
    else: 
    print 'fail' 

''' 
ex 2: return state only if script should continue 
''' 

def should_continue(bool): 
    if bool: 
    return True 
    else: 
    print 'fail' 
    sys.exit() # we terminate from here 

def init(): 
    if should_continue(True): 
    print 'pass' 


''' 
ex 3: Don't return state. Script will continue if should_continue doesn't cause termination of script 
''' 

def should_continue(bool): 
    if not bool: 
    print 'fail' 
    sys.exit() 

def init(): 
    should_continue(True) 
    print 'pass' 

답변

1

에 달려 있습니다.

false_continue가 false로 확인되면 즉시 종료 할 수 있다면 그렇게하십시오. 대안은 "stop"이 각 레벨에서 점검 될 필요가있는 콜 체인 (call-chain)까지 모든 것을 반환하는 것입니다. 이것은 오류가 발생하기 쉽고 읽기가 어렵습니다.

그냥 나가는 것이 그리 그리 바람직하지 않고, 종종 정리 나 '이봐 ... 왜냐하면 ...'이 필요한 경우가 아니라면, 그냥 끝내면 안됩니다. 깊게 중첩 된 함수와

class TimeToSayGoodbye(Exception): 
    def __init__(self, reason): 
     self.reason = reason 

:

def way_down_the_stack(): 
    if not should_continue: 
     raise TimeToSayGoodbye('drive safely') 

당신은 아무 것도 할 수 없다면, 파이썬은 유용한를 생성하면 예를 들어 파이썬을 사용하기 때문에, 예외 처리의 화려 깨끗한 방법이있다 (그러나 꽤) backtrace.

def main(): 
    try: 
     my_application() 
    except TimeToSayGoodbye as e: 
     print (e.reason) 

같은 주요 외모는 그 다음 최상위 어디서든 일어나는 안녕의 제어 및 심지어 프로그램이 자발적으로 끝날 수도 있음을 알아야 할 필요가 way_down_the_stack 만든 my_application 사이의 다섯 가지 방법 중에있는 경우.

+0

답장을 보내 주셔서 감사합니다. 하나의 질문. 예외를 발생시키는 메서드를 호출하는 메서드로 로컬 처리하지 않고 예외를 메인에서 처리하도록하는 것이 좋습니다. – BIOS

+1

"예상치 못한 문제를 고칠 수는 있지만 수정 할 수없는 것을 잡아서 호출자가 예상하지 못한 것을 처리하게하십시오."거래하는 "코드가 스택에서 최대 7 레벨 인 경우에도 본관." - [사전 답변]에서 (http://stackoverflow.com/questions/2843112/how-can-i-find-a-list-of-all-exceptions-that-a-given-library-function-throws -in/2843649 # 2843649). – msw

+0

좋은 답변입니다. 매우 간결합니다. 고마워. 귀하의 다른 대답은 정말 내 목적에 도움이됩니다 :) – BIOS