Development Tip

else의 목적과 마지막으로 예외 처리

yourdevel 2020. 11. 30. 20:06
반응형

else의 목적과 마지막으로 예외 처리


예외 처리 elsefinally섹션이 중복됩니까? 예를 들어, 다음 두 코드 스 니펫간에 차이점이 있습니까?

try:
    foo = open("foo.txt")
except IOError:
    print("error")
else:
    print(foo.read())
finally:
    print("finished")

try:
    foo = open("foo.txt")
    print(foo.read())
except IOError:
    print("error")
print("finished")

보다 일반적으로의 내용을 else항상으로 이동할 try수 없으며의 내용을 finallytry / catch 블록 외부로 이동할 수 없습니까? 그렇다면 else의 목적은 무엇 finally입니까? 가독성을 높이기위한 것입니까?


아이디어는 예외를 처리하는 코드를 가능한 한 작게 유지하는 것입니다. else블록의 모든 것이 , yes 로 이동할 try 있지만 실제로 발생하기를 원할 때 예외가 발생할 수 있습니다. 파일을 성공적으로 열었을 수 있지만 read원인이 IOError파일에 있으면 해당 파일 try도 포착됩니다.

로부터 말의 입 :

else절을 사용 try하면 try ... except문에 의해 보호되는 코드에 의해 발생하지 않은 예외를 실수로 포착하는 것을 방지 할 수 있으므로 절에 추가 코드를 추가하는 것보다 낫습니다 .

다른 두 답변이 이미 말한 것처럼, finally블록은 예외를 발생의 유무를 실행 얻을 것이다 코드가 어디 안에 포함 else하거나 except, 예외가 처리되었는지 여부. 이에 대한 표준 사용 사례는 어떤 일이 있어도 파일 핸들이 닫혀 있는지 절대적으로 확인하는 것입니다. *

이것에 대한 공식적인 표현 :

try에서 예외가 발생하고 절에서 처리되지 않은 경우 except(또는 exceptor else에서 발생한 경우) finally절이 실행 된 후 다시 발생합니다 . finally절은 또한 어떤 다른 절 "밖으로 길에"실행 try문이를 통해 남아있는 break, continue또는 return문.


*이 특정 사용은 컨텍스트 관리자 ( with...as블록)에 의해 다소 제거되었습니다 .


finallytry 블록의 문이 실패하거나 성공하는지 여부에 관계없이 실행됩니다. elsetry 블록의 문이 예외를 발생시키지 않는 경우에만 실행됩니다.


무슨 일이 있어도의 블록은 finally 항상 실행됩니다. 예외가 처리되지 않았거나 예외 핸들러 자체가 새로운 예외를 생성하더라도.


else블록 내에서 try블록 의 내용을 이동하면 블록 중에 발생할 수있는 예외도 포착됩니다 else. 라인

print(foo.read())

귀하의 예제에서 IOError, 첫 번째 코드 스 니펫은 해당 오류를 포착하지 않지만 두 번째 스 니펫은. try일반적으로 포착하려는 예외 만 포착 하기 위해 블록을 가능한 한 작게 유지하려고합니다 .

finally블록은 항상 무슨 일이 있어도 실행되지됩니다. 예를 들어 try블록에 return문이 포함되어 있으면 finally블록은 계속 실행되지만 전체 try/ except블록 아래의 코드는 실행 되지 않습니다.

참고 URL : https://stackoverflow.com/questions/6051934/purpose-of-else-and-finally-in-exception-handling

반응형