복붙노트

[PYTHON] Python try finally 블록 반환 [duplicate]

PYTHON

Python try finally 블록 반환 [duplicate]

아래에 흥미로운 코드가 있습니다.

def func1():
    try:
        return 1
    finally:
        return 2

def func2():
    try:
        raise ValueError()
    except:
        return 1
    finally:
        return 3

func1()
func2()

누군가 두 가지 기능을 반환하고 WHY를 설명 할 수있는 설명을 해주십시오. 즉 실행 순서를 설명합니다.

해결법

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

    1.파이썬 문서에서

    파이썬 문서에서

    따라서 try / except 블록은 return을 사용하여 반환 값을 설정하면 반환 값을 지정합니다. finally 블록은 항상 실행되며 다른 반환을 사용하는 동안 리소스 등을 비우는 데 사용해야합니다. 원래의 블록을 덮어 씁니다.

    특별한 경우 func1 ()은 2를 반환하고 func2 ()는 3을 반환합니다. 이는 finally 블록에 반환되는 값이기 때문입니다.

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

    2.항상 finally 블록으로 이동하므로 try en을 제외하고는 return을 무시합니다. try와 except보다 높은 수익을 얻으려면 그 값을 반환합니다.

    항상 finally 블록으로 이동하므로 try en을 제외하고는 return을 무시합니다. try와 except보다 높은 수익을 얻으려면 그 값을 반환합니다.

    def func1():
        try:
            return 1 # ignoring the return
        finally:
            return 2 # returns this return
    
    def func2():
        try:
            raise ValueError()
        except:
            # is going to this exception block, but ignores the return because it needs to go to the finally
            return 1
        finally:
            return 3
    
    def func3():
        return 0 # finds a return here, before the try except and finally block, so it will use this return 
        try:
            raise ValueError()
        except:
            return 1
        finally:
            return 3
    
    
    func1() # returns 2
    func2() # returns 3
    func3() # returns 0
    
  3. ==============================

    3.미리 진술서를 인쇄하면 실제로 도움이됩니다.

    미리 진술서를 인쇄하면 실제로 도움이됩니다.

    def func1():
        try:
            print 'try statement in func1. after this return 1'
            return 1
        finally:
            print 'after the try statement in func1, return 2'
            return 2
    
    def func2():
        try:
            print 'raise a value error'
            raise ValueError()
        except:
            print 'an error has been raised! return 1!'
            return 1
        finally:
            print 'okay after all that let\'s return 3'
            return 3
    
    print func1()
    print func2()
    

    이것은 다음을 반환합니다.

    try statement in func1. after this return 1
    after the try statement in func1, return 2
    2
    raise a value error
    an error has been raised! return 1!
    okay after all that let's return 3
    3
    

    파이썬은 항상 "도달 한"코드가 두 함수에서 모두 1을 반환하는지에 관계없이 반환되는 마지막 것을 반환한다는 것을 알 수 있습니다.

    finally 블록은 항상 실행되므로 함수에서 마지막으로 반환되는 것은 finally 블록에서 반환되는 것이 전부입니다. func1에서는 2입니다. func2에서는 3입니다.

  4. ==============================

    4.func1 ()은 2를 반환합니다. func2 ()는 3을 반환합니다.

    func1 ()은 2를 반환합니다. func2 ()는 3을 반환합니다.

    마지막으로 블록은 관계없이 또는 예외적으로 실행됩니다.

    디버거를 사용하여 실행 순서를 볼 수 있습니다. 예를 들어 화면 캐스트를 참조하십시오.

  5. from https://stackoverflow.com/questions/19805654/python-try-finally-block-returns by cc-by-sa and MIT license