'finally'는 항상 파이썬에서 실행됩니까?
Python에서 가능한 Try-final 블록에 대해, 그것이 보장됩니까?finally차단이 항상 실행됩니까?
예를 들어, 내가 집에 있을 때 돌아온다고 가정해 보겠습니다.except슬라이드:
try:
1/0
except ZeroDivisionError:
return
finally:
print("Does this code run?")
아니면 내가 다시 키웠거나Exception:
try:
1/0
except ZeroDivisionError:
raise
finally:
print("What about this code?")
는 다음과 같습니다.finally위의 예에서 실행되지만, 제가 생각하지 못한 다른 시나리오가 있을 것 같습니다.
다음과 같은 시나리오가 있습니까?finally블록이 파이썬에서 실행에 실패할 수 있습니까?
은 "보장"보다 더 단어입니다.finally마땅히 받아야 할만약 사형 집행이 전체에서 흘러나온다면 보장되는 것은try-finally구성, 그것은 다음을 통과할 것입니다.finally그렇게 하기 위해서.보장되지 않는 것은 실행이 외부로 유출된다는 것입니다.try-finally.
개체가 끝까지 실행되지 않으면 생성기 또는 비동기 코루틴의 A이(가) 실행되지 않을 수 있습니다.발생할 수 있는 방법은 여러 가지가 있습니다. 다음 중 하나가 있습니다.
def gen(text): try: for line in text: try: yield int(line) except: # Ignore blank lines - but catch too much! pass finally: print('Doing important cleanup') text = ['1', '', '2', '', '3'] if any(n > 1 for n in gen(text)): print('Found a number') print('Oops, no cleanup.')까다롭다는 하십시오. 은 " " " 를 . 생성기가 가비지 수집될 때 Python은 다음을 실행하려고 시도합니다.
finallyGeneratorExit예외, 하지만 여기서 우리는 그 예외를 잡고 그 다음에.yieldPython이 경고("제너레이터 ignored GeneratorExit")를 출력하고 포기합니다.자세한 내용은 PEP 342(향상된 생성기를 통한 코루틴)를 참조하십시오.위해 다른 가 GC가 아닌 해), 또는 GC'ed가 GC'ed인 (CPython에서도 가능해),
async withawait죄를 짓는__aexit__가 대상이또는인await상심한yield단번에finally차단. 이 목록은 전체적인 것이 아닙니다.os._exit실행하지 않고 프로세스를 즉시 중지합니다.finally블록들os.fork유발할 수 있는finally두 번 실행할 블록입니다.공유 리소스에 대한 액세스가 올바르게 동기화되지 않으면 두 번 발생할 것으로 예상되는 일반적인 문제뿐만 아니라 동시 액세스 충돌(충돌, 중지 등)이 발생할 수 있습니다.때부터
multiprocessingFork-without-exec을 사용하여 Fork Start 메서드(Unix의 기본값)를 사용할 때 worker 프로세스를 생성한 다음 호출합니다.os._exit이 끝나면 에게, 노자동의일노끝안에서동자면나이▁in노,안▁once서에▁the,finally그리고.multiprocessing교호작용은 문제가 될 수 있습니다(예:).- 오류는 C-레벨 분할 오류를 합니다.
finally실행할 수 없습니다. kill -SIGKILL할 수 있습니다.finally실행할 수 없습니다.SIGTERM그리고.SIGHUP또한 예방할 것입니다.finally한 은 사자가직종핸설들않치으실차를 하지 않습니다. 기본적으로 Python은 이를 처리하지 않습니다.SIGTERM또는SIGHUP.- 에서는 입니다.
finally정리가 완료되지 않도록 할 수 있습니다.특히 주목할 만한 경우는 우리가 실행을 시작할 때 사용자가 control-C를 누른 경우입니다.finally이 록블을 입니다. 파이썬은 a를 올릴 것입니다.KeyboardInterrupt▁▁the다▁every▁skip▁and니의 모든 행을 건너뜁니다.finally블록의 내용물(KeyboardInterrupt는 쓰기 매우 -safe 코드는 쓰기 어렵습니다. - 컴퓨터의 전원이 꺼지거나 최대 절전 모드에서 깨어나지 않는 경우
finally블록이 실행되지 않습니다.
그finally블록은 트랜잭션 시스템이 아닙니다. 원자성 보장 같은 것을 제공하지 않습니다.이러한 예들 중 일부는 명백해 보일 수 있지만, 그러한 일들이 일어날 수 있다는 것을 잊고 의지하기 쉽습니다.finally과분하게
네. 마침내 항상 승리합니다.
그것을 물리치는 유일한 방법은 사형 집행을 중단하는 것입니다.finally:실행 기회를 얻습니다(예: 인터프리터 충돌, 컴퓨터 끄기, 제너레이터 영구 일시 중단).
제가 생각하지 못한 다른 시나리오들이 있을 것 같습니다.
여기 여러분이 생각하지 못했을 수도 있는 몇 가지가 더 있습니다.
def foo():
# finally always wins
try:
return 1
finally:
return 2
def bar():
# even if he has to eat an unhandled exception, finally wins
try:
raise Exception('boom')
finally:
return 'no boom'
인터프리터를 종료하는 방법에 따라 다음과 같이 최종적으로 "취소"할 수 있는 경우가 있습니다.
>>> import sys
>>> try:
... sys.exit()
... finally:
... print('finally wins!')
...
finally wins!
$
불안정한 사용(제 생각에는 "통역기 충돌"에 해당합니다):
>>> import os
>>> try:
... os._exit(1)
... finally:
... print('finally!')
...
$
저는 현재 이 코드를 실행하고 있습니다. 우주의 열사 후에도 최종적으로 실행될 수 있는지 테스트하기 위해서입니다.
try:
while True:
sleep(1)
finally:
print('done')
하지만 아직 결과를 기다리고 있으니, 나중에 다시 확인해보세요.
파이썬 문서에 따르면:
코드 블록이 완료되고 발생한 예외가 처리되면 이전에 발생한 상황과 상관없이 최종 블록이 실행됩니다.예외 처리기 또는 other-block에 오류가 있고 새 예외가 발생하더라도 final-block의 코드는 계속 실행됩니다.
또한 마지막 블록에 하나를 포함하여 여러 개의 반환 문이 있는 경우 마지막 블록 반환만이 실행됩니다.
음, 예, 아니오.
보장되는 것은 Python이 항상 마지막 블록을 실행하려고 한다는 것입니다.블록에서 돌아오거나 캡처되지 않은 예외를 발생시키는 경우, 실제로 예외를 반환하거나 발생시키기 직전에 최종적으로 블록이 실행됩니다.
(질문에서 코드를 실행하는 것만으로 자신을 제어할 수 있었던 것)
제가 최종적으로 블록이 실행되지 않을 것이라고 상상할 수 있는 유일한 경우는 예를 들어 C 코드 내부나 정전 때문에 파이썬 인터프리터 자체가 충돌하는 경우입니다.
제너레이터 기능을 사용하지 않고 이 기능을 찾았습니다.
import multiprocessing
import time
def fun(arg):
try:
print("tried " + str(arg))
time.sleep(arg)
finally:
print("finally cleaned up " + str(arg))
return foo
list = [1, 2, 3]
multiprocessing.Pool().map(fun, list)
절전 모드는 일정하지 않은 시간 동안 실행될 수 있는 모든 코드일 수 있습니다.
여기서 발생하는 것처럼 보이는 것은 완료하기 위한 첫 번째 병렬 프로세스가 성공적으로 시도 블록을 떠나지만 함수에서 정의되지 않은 값(foo)을 반환하려고 시도하여 예외가 발생한다는 것입니다.이 예외는 다른 프로세스가 최종 블록에 도달하도록 허용하지 않고 맵을 삭제합니다.
한또라추가면하을인한하면추.bar = bazz수면 후에 시도 블록에 전화를 걸었습니다.그런 다음 해당 라인에 도달하는 첫 번째 프로세스는 예외를 던집니다(배즈가 정의되지 않았기 때문에). 이는 자신의 블록이 최종적으로 실행되도록 하지만 맵을 종료하여 다른 시도 블록이 최종 블록에 도달하지 못하고 사라지도록 하며, 첫 번째 프로세스도 반환 문에 도달하지 못하게 합니다.
이것이 Python 멀티프로세싱에서 의미하는 것은 프로세스 중 하나라도 예외가 있을 수 있는 경우 모든 프로세스의 리소스를 정리하는 예외 처리 메커니즘을 신뢰할 수 없다는 것입니다.멀티프로세싱 맵 호출 외부의 리소스를 관리하거나 추가적인 신호 처리가 필요합니다.
마지막으로 if 문을 사용할 수 있습니다. 아래 예제는 네트워크 연결을 확인하고 연결된 경우 마지막 블록을 실행합니다.
try:
reader1, writer1 = loop.run_until_complete(self.init_socket(loop))
x = 'connected'
except:
print("cant connect server transfer") #open popup
x = 'failed'
finally :
if x == 'connected':
with open('text_file1.txt', "r") as f:
file_lines = eval(str(f.read()))
else:
print("not connected")
언급URL : https://stackoverflow.com/questions/49262379/does-finally-always-execute-in-python
'programing' 카테고리의 다른 글
| grid.arrange를 사용하여 가변 플롯 목록을 정렬하려면 어떻게 해야 합니까? (0) | 2023.06.13 |
|---|---|
| POI / Excel : "상대적" 방식으로 공식 적용 (0) | 2023.06.13 |
| Next 2와 3에서 현재 경로 이름을 얻는 방법은 무엇입니까? (0) | 2023.06.13 |
| 오라클 SQL 개발자에서 clob 필드 데이터를 내보내는 방법 (0) | 2023.06.13 |
| 사용자 지정 구성 요소 | 초기화 전에 '스토어'에 액세스할 수 없습니다. (0) | 2023.06.13 |