8.1. 문법 에러
- 파싱 에러
- syntaxError
while True print('Hello world')
File "<stdin>", line 1
whileTrue print('Hello world')
^
SyntaxError: invalid syntax
⇒ 작은 화살표 앞에 오는 토큰이 원인
⇒ 에러의 원인 : print() 앞에 콜론(:)이 없음
8.2. 예외→ RuntimeError
- 문장이나 표현식이 올바르지만, 에러가 발생함
- 문장 Statements : 값이 없고, 대입할 수 없다.
- ex) if True: print(’hello’)
- 식 Expressions : 값이 있고, 대입할 수 있다.
- ex) 3+4
- 문장 Statements : 값이 없고, 대입할 수 없다.
- 실행 중에 감지되는 에러 : 예외
10 * (1/0) ⇒ ZeroDivisonError : 0으로 나눌 수 없는 오류
4 + spam*3 ⇒ NameError : spam이 정의되지 않음
‘2’ + 2 ⇒ TypeError : type이 달라서 생기는 오류
8.3. 예외 처리하기
- 선택한 예외를 처리하는 프로그램을 만들기
while True:
try:
x = int(input("Please enter a number: ")) # x에 숫자만 넣기
break # 예외가 발생하지 않으면, while문은 종료된다.
except ValueError: # VauleError가 발생한다면
print("Oops! That was no valid number. Try again..") # print아래 문으로 출력되고, while문이 다시 실행된다.
- try 문이 실행되는 동안에 예외가 발생한다면, 절의 나머지는 스킵됩니다.
- 타입이 except 키워드 뒤에 명명된 예외와 일치하면, except 절이 실행되고, try/except 블록이후에 실행됩니다.
- exception이 exception 절안에 명명된 예외와 매치되지 않는 예외가 말생한다면, 밖의 try 문으로 패스될 것이다.
- 핸들러가 발견되지 않는다면, 언핸들러된 예외이고, 예외는 위에 보이는 것처럼 메시지를 나타내면서 중지된다.
except (RuntimeError, TypeError, NameError ):
pass
- try 문에는 다른 예외에 대한 처리기를 지정하기 위해 둘 이상의 except 절이 있을 수 있습니다. 최대 하나의 핸들러가 실행됩니다. 핸들러는 동일한 try 문의 다른 핸들러가 아니라 해당하는 try 절에서 발생하는 예외만 처리합니다. 예외 절은 여러 예외를 괄호로 묶인 튜플로 명명할 수 있습니다. 예를 들면 다음과 같습니다.
예외절의 클래스
- 동일한 클래스 또는 기본 클래스인 경우 예외와 호환됨
- (파생 클래스를 나열하는 예외 절은 기본 클래스와 호환되지 않음)
- except 절이 반전된 경우(except B가 먼저 사용됨) B, B, B가 인쇄되었을 것입니다. 첫 번째로 일치하는 except 절이 트리거됩니다.
- 모든 예외는 BaseException에서 상속되므로 와일드카드로 사용할 수 있습니다. 이런 식으로 실제 프로그래밍 오류를 숨기기 쉽기 때문에 극도로 주의해서 사용하십시오! 또한 오류 메시지를 인쇄한 다음 예외를 다시 발생시키는 데 사용할 수도 있습니다(호출자도 예외를 처리할 수 있음).
import sys
try :
f = open('mytfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err :
print("Could not convert data to an integer.")
except ValueError :
print("Could not coverty data to an integer.")
except BaseException as err:
print(f"Unexpected {err=}, {type(err)=}")
raise
또는 마지막 예외 절에서 예외 이름을 생략할 수 있지만 예외 값은 sys.exc_info()[1]에서 검색해야 합니다. try ... except 문에는 선택적 else 절이 있으며, 이 절이 있는 경우 모든 except 절 뒤에 와야 합니다. try 절에서 예외가 발생하지 않는 경우 실행해야 하는 코드에 유용합니다. 예를 들어:
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except OSError:
print('cannot open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
else 절 사용
- else 는 파이썬에만 있다.
- try문은 여러개 안쓸려고 , 의도치 않은 에러를 막기 위해서 else를 쓴다.
try :
raise Exception('spam','eggs')
except Exception as inst:# 발생한 예외를 inst에 넣음
print(type(inst)) # 예외처리 인스턴스
print(inst.args) # arguments .args에 저장됨
print(inst) # __str__ args가 직접적으로 프린트되도록 허용하지만
# 예외처리 서브클래스에 덮어씌워질수도 있다.
x,y = inst.args # 언팩 args
print('x = ', x)
print('y = ', y)
인자 : 예외가 발생할때 가지는 연관된 값
- 인자의 존재와 형은 예외 형에 의존적입니다.
8.4. 예외 일으키기 (사용자에러를 처리)
raise : 프로그래머가 지정한 예외가 발생하도록 강제할 수 있게 함
raise NameError('HiThere')
예외가 발생했는지를 알고 싶음
처리하고 싶지는 않음
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
raise
8.5. 예외 연쇄
raise 문 from 연결 예외를 활성화하는 선택 사항을 허용
raise RuntimeError from exc
def func():
raise ConnectionError
try:
func()
except ConnectionError as exc:
raise RuntimeError('Failed to open database' from exc)
최종적으로는, 다른 에러로 처리하고 싶을때, exc로 저장된 에러를 raise 런타임으로 해서, exc 를 포함시켜서 같이 raise
두가지 에러를 한번에 보여줌.
에럭라 무슨 이유로 발생햇는지 한번에 보내줌.
**from** None: 에러가 어디서 낫는지 알아야되는데 어디서 예외가 발생햇는지 감춰져서 잘안씀
8.6. 사용자 정의 예외 (껍데기)
- 사용자 정의 예외 → 예외를 만들 수 있다.
- 예외 클래스 만듦으로써 프로그램응은 자신의 예외에 이름을 붙일 수 있음
- 다른 클래스가 할 수 있는 모든 작업을 수행하는 예외 클래스를 정의할 수 있지만 단순하게 유지되며 종종 예외 처리가 오류에 대한 추출할 수 있도록 하는 속성만 제공합니다.
- 대부분의 예외는 표준 예외들의 이름들과 유사하게 “Error”로 끝나는 이름으로 정의된다.
- “Error” 로 끝나는 이름으로 정의됨ㄷ
**class** **DerivedClassName**(EXCEPTION ERROR):
8.7. 뒷정리 동작 정의하기
try:
raise KeyboardInterrupt
finally:
print('Goodbye, world!')
KeyboardInterrupt
- 채팅 →글자 → 받은 글자 출력 → UNKOWN 채팅 에러 → 제대로 된 문자열 출력, 제대로 되지않았다는 출력을 해줌
- 모든 상황에 실행되어야 하는 뒷정리 동작 정의
- finally 절 → try 문이 완료되기 전에 finally 절이 마지막 작업으로 실행됨
- finally 절이 break , continue 또는 문을 실행하며 return 예외 발생 안함
- try 문이 break , continue 또는 return 문에 도달하면
- finally 절에 return 문이 포함되면, 반환 값은 try 절의 return 문이 주는 값이 아니라 finally 절의 return 문이 주는 값이 됨
8.8 미리 정의된 뒷정리 동작들
WITH → CLOSE 자동으로 해줌
TRY - > OPEN → CLOSE ⇒ WITH
'파이썬' 카테고리의 다른 글
11. 표준 라이브러리 -2 (0) | 2022.08.21 |
---|---|
10. 표준 라이브러리 (0) | 2022.08.21 |
Class (0) | 2022.07.31 |
파일 읽기 쓰기 (0) | 2022.06.30 |
7. 입력과 출력 (0) | 2022.06.28 |
댓글