우리가 필요로하는 이유는 확실하지 오전 finally
에 try...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
. continue
및break
제어문 과 같은 기타 제어 흐름 문.
답변
당신은 사용할 수 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
절은 어떤을 포함하여, 실행except
및else
절. 절에서 예외가 발생하여 처리되지 않으면 예외가 일시적으로 저장됩니다.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 절은 리소스 사용의 성공 여부에 관계없이 외부 리소스 (예 : 파일 또는 네트워크 연결)를 해제하는 데 유용합니다.