복붙노트

[PYTHON] 이상한 Try-Except-Else-Finally 동작 (Return 문 사용) [duplicate]

PYTHON

이상한 Try-Except-Else-Finally 동작 (Return 문 사용) [duplicate]

이것은 특이하게 행동하는 일부 코드입니다. 이것은 내가 작성한 비헤이비어의 단순화 된 버전입니다. 이것은 여전히 ​​이상한 행동을 보여줄 것이고 나는 왜 이것이 일어나고 있는지에 대해 몇 가지 구체적인 질문을했습니다.

Windows 7에서 Python 2.6.6을 사용하고 있습니다.

def demo1():
    try:
        raise RuntimeError,"To Force Issue"
    except:
        return 1
    else:
        return 2
    finally:
        return 3

def demo2():
    try:
        try:
            raise RuntimeError,"To Force Issue"
        except:
            return 1
        else:
            return 2
        finally:
            return 3
    except:
        print 4
    else:
        print 5
    finally:
        print 6

if __name__ == "__main__":
    print "*** DEMO ONE ***"
    print demo1()
    print "****************"
    print 
    print "*** DEMO TWO ***"
    print demo2()
    print "****************"

이 스크립트를 실행하면 다음과 같이 인쇄됩니다.

*** DEMO ONE ***
3
****************

*** DEMO TWO ***
6
3
****************

왜 데모가 1 대신 3을 반환합니까? 왜 데모는 6 또는 4 또는 5를 인쇄하는 대신 6 인쇄 2입니까?

당신의 도움을 주셔서 감사합니다.

해결법

  1. ==============================

    1.finally 문이 실행되도록 보장되기 때문에 (잘, 정전이나 파이썬의 통제 밖의 어떤 것이 없다고 가정). 즉, 함수가 반환하기 전에 finally 블록을 실행해야합니다. finally 블록은 다른 값을 반환합니다.

    finally 문이 실행되도록 보장되기 때문에 (잘, 정전이나 파이썬의 통제 밖의 어떤 것이 없다고 가정). 즉, 함수가 반환하기 전에 finally 블록을 실행해야합니다. finally 블록은 다른 값을 반환합니다.

    파이썬 문서 상태 :

    즉, 반환하려고하면 finally 블록이 호출되어 반환 할 값이 아닌 반환됩니다.

  2. ==============================

    2.실행 순서는 다음과 같습니다.

    실행 순서는 다음과 같습니다.

    따라서 finally 블록의 모든 반환은 미리 단계를 종료합니다.

  3. from https://stackoverflow.com/questions/11164144/weird-try-except-else-finally-behavior-with-return-statements by cc-by-sa and MIT license