왜 파이썬에서 “최종”절이 필요한가? TypeError: run_code2() other_code() 이 사용하는 것과

우리가 필요로하는 이유는 확실하지 오전 finallytry...except...finally문. 제 생각에는이 코드 블록

try:
    run_code1()
except TypeError:
    run_code2()
other_code()

이 사용하는 것과 동일합니다 finally:

try:
    run_code1()
except TypeError:
    run_code2()
finally:
    other_code()

뭔가 빠졌습니까?



답변

일찍 돌아 오면 차이가 있습니다.

try:
    run_code1()
except TypeError:
    run_code2()
    return None   # The finally block is run before the method returns
finally:
    other_code()

이것과 비교하십시오 :

try:
    run_code1()
except TypeError:
    run_code2()
    return None   

other_code()  # This doesn't get run if there's an exception.

차이가 발생할 수있는 다른 상황 :

  • except 블록 안에 예외가 발생하는 경우.
  • 예외가 던져 경우 run_code1()만은 아니다 TypeError.
  • continuebreak제어문 과 같은 기타 제어 흐름 문.

답변

당신은 사용할 수 finally있는지 파일이나 자원이 닫히거나에 관계없이 예외가 발생하는지의 출시하기 위해 당신이 예외를 catch하지 않는 경우에도 마찬가지입니다. (또는 특정 예외를 잡지 않으면 )

myfile = open("test.txt", "w")

try:
    myfile.write("the Answer is: ")
    myfile.write(42)   # raises TypeError, which will be propagated to caller
finally:
    myfile.close()     # will be executed before TypeError is propagated

이 예에서는 with명령문을 사용하는 것이 더 좋지만 이러한 종류의 구조는 다른 종류의 리소스에 사용될 수 있습니다.

몇 년 후, 나는 독자들이 재미있는 것으로 남용 할 수 있는 블로그 게시물을 썼습니다 finally.


답변

그것들은 동등하지 않습니다. 마지막으로 코드는 다른 일이 발생해도 실행됩니다. 정리 코드를 실행하는 데 유용합니다.


답변

위의 다른 답변에 추가하기 위해 예외가 발생하지 않은 경우에만 절이 실행 finally되는 반면에 else절은 실행됩니다.

예를 들어, 예외없이 파일에 쓰면 다음이 출력됩니다.

file = open('test.txt', 'w')

try:
    file.write("Testing.")
    print("Writing to file.")
except IOError:
    print("Could not write to file.")
else:
    print("Write successful.")
finally:
    file.close()
    print("File closed.")

산출:

Writing to file.
Write successful.
File closed.

예외가있는 경우 코드는 다음을 출력합니다 (파일을 읽기 전용으로 유지하면 의도적 인 오류가 발생합니다.

file = open('test.txt', 'r')

try:
    file.write("Testing.")
    print("Writing to file.")
except IOError:
    print("Could not write to file.")
else:
    print("Write successful.")
finally:
    file.close()
    print("File closed.")

산출:

Could not write to file.
File closed.

finally예외에 관계없이 절이 실행 되는 것을 볼 수 있습니다 . 도움이 되었기를 바랍니다.


답변

코드 블록은 동일하지 않습니다. finally경우 절은 실행됩니다 run_code1()이외의 예외가 발생 TypeError하거나하는 경우는 run_code2()있지만, 예외를 throw other_code()첫 번째 버전에서 이러한 경우에 실행되지 않습니다.


답변

첫 번째 예에서 run_code1()그렇지 않은 예외가 발생하면 어떻게됩니까 TypeError? … other_code()실행되지 않습니다.

finally:버전 과 비교하십시오 : other_code()예외 발생에 관계없이 실행됩니다.


답변

에서 설명하고있는 바와 같이 문서finally절을 실행해야합니다 청소 작업을 정의하기위한 것입니다 모든 상황을 .

경우 finally존재, 그것은 ‘정리’핸들러를 지정합니다. try
절은 어떤을 포함하여, 실행 exceptelse절. 절에서 예외가 발생하여 처리되지 않으면 예외가 일시적으로 저장됩니다. finally절은 실행됩니다. 저장된 예외가있는 경우 finally
조항 끝에서 다시 발생합니다 .

예를 들면 :

>>> def divide(x, y):
...     try:
...         result = x / y
...     except ZeroDivisionError:
...         print("division by zero!")
...     else:
...         print("result is", result)
...     finally:
...         print("executing finally clause")
...
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'

보시다시피, finally절은 모든 이벤트에서 실행됩니다. TypeError개의 스트링을 분할함으로써 발생은 처리되지 except절과 후 따라서 레이즈 다시 finally절 실행되었다.

실제 응용 프로그램에서 finally 절은 리소스 사용의 성공 여부에 관계없이 외부 리소스 (예 : 파일 또는 네트워크 연결)를 해제하는 데 유용합니다.