else의 목적과 마지막으로 예외 처리
예외 처리 의 else
및 finally
섹션이 중복됩니까? 예를 들어, 다음 두 코드 스 니펫간에 차이점이 있습니까?
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
수 없으며의 내용을 finally
try / catch 블록 외부로 이동할 수 없습니까? 그렇다면 else
과 의 목적은 무엇 finally
입니까? 가독성을 높이기위한 것입니까?
아이디어는 예외를 처리하는 코드를 가능한 한 작게 유지하는 것입니다. else
블록의 모든 것이 , yes 로 이동할 수try
있지만 실제로 발생하기를 원할 때 예외가 발생할 수 있습니다. 파일을 성공적으로 열었을 수 있지만 read
원인이 IOError
및 파일에 있으면 해당 파일 try
도 포착됩니다.
로부터 말의 입 :
이
else
절을 사용try
하면try ... except
문에 의해 보호되는 코드에 의해 발생하지 않은 예외를 실수로 포착하는 것을 방지 할 수 있으므로 절에 추가 코드를 추가하는 것보다 낫습니다 .
다른 두 답변이 이미 말한 것처럼, finally
블록은 예외를 발생의 유무를 실행 얻을 것이다 코드가 어디 안에 포함 else
하거나 except
, 예외가 처리되었는지 여부. 이에 대한 표준 사용 사례는 어떤 일이 있어도 파일 핸들이 닫혀 있는지 절대적으로 확인하는 것입니다. *
이것에 대한 공식적인 표현 :
try
절 에서 예외가 발생하고 절에서 처리되지 않은 경우except
(또는except
orelse
절 에서 발생한 경우)finally
절이 실행 된 후 다시 발생합니다 .finally
절은 또한 어떤 다른 절 "밖으로 길에"실행try
문이를 통해 남아있는break
,continue
또는return
문.
*이 특정 사용은 컨텍스트 관리자 ( with...as
블록)에 의해 다소 제거되었습니다 .
finally
try 블록의 문이 실패하거나 성공하는지 여부에 관계없이 실행됩니다. else
try 블록의 문이 예외를 발생시키지 않는 경우에만 실행됩니다.
무슨 일이 있어도의 블록은 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
'Development Tip' 카테고리의 다른 글
DBML 디자이너에서 테이블을 빠르게 찾습니까 (검색)? (0) | 2020.11.30 |
---|---|
자바 스크립트의 array.select () (0) | 2020.11.30 |
파이썬 셸에서 클래스를 다시로드하는 방법? (0) | 2020.11.30 |
ggplot2에 대한 미학 테이블이나 카탈로그가 있습니까? (0) | 2020.11.30 |
Jenkins가 작업을 실행하지 않음 (보류 중-다음 실행기를 기다리는 중) (0) | 2020.11.30 |