* 예외처리
① 예외 (exception)
일반적으로 '에러' (error) 라고 부름
에러가 발생하면 프로그램이 비정상적으로 종료된다.
②예외 처리(exception handling)
문제 발생 코드를 수정하는 것이 아닌 그 이후의 코드를 이용하여 끝까지 프로그램이 실행될 수 있도록 한다.
'''
예외 처리
'''
print("1>")
n = 0
result = 50 / n
print("result", result)
print("end 정상종료")
위 프로그램을 실행하면 ZeroDivisionError가 발생하기 때문에 end 정상종료가 출력되지 않고
비정상 종료된다.
print("1>")
try:
n = 0
result = 50 / n
print("result", result)
except ArithmeticError as e: # 다형성(polymorphism)
# ArithmeticError as e 가 e = ArithmeticError() 동일
# 참조변수를 prinbt(e)하면 __str__(self) 호출된다.
# division by zero 문자열이 출력되었기 때문에
# __str__(self)가 리턴하는 값은 division by zero 라고 추측할 수 있다.
# 재정의 했음.
print("0으로 나누어서 예외가 발생", e) # division by zero
print("end 정상종료")
print(ZeroDivisionError.mro())
'''
[<class 'ZeroDivisionError'>, <class 'ArithmeticError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>]
'''
0으로 나누었을 때 발생하는 예외를 try ~ except 구문으로 예외 처리 해주었다.
이 때 ZeroDivisionError 를 사용하지 않고 ArithmeticError 를 사용해도 정상 출력 된 이유는
ArithmeticError가 ZeroDivisionError의 상위 클래스 이기 때문!
만약 발생할 여러 에러의 상위 클래스가 같다면 상위클래스 하나만 쓰는게 더욱 효율적일 것임
https://docs.python.org/3/library/exceptions.html?highlight
=exception%20hierarchy#exception-hierarchy
에러 클래스들은 위의 사이트에 가면 자세히 볼 수 있다.
'''
예외 처리
'''
print("1>")
try:
n = 10
result = 50 / n
print("result", result)
except ArithmeticError as e:
print("0으로 나누어서 예외가 발생", e)
else:
print("예외가 발생되지 않았을 때....")
finally:
# 파이썬에서 외부 자원(DB,파일등)을 사용할 때는 반드시 쓸께요..(open함수), 사용후에는 잘 썼어요 ( close 함수 )
print("예외발생여부와 상관없이 무조건 수행")
print("end 정상종료")
# 예외처리 목적이 아닌 반드시 수행되는 문장이 무엇인지를 알려주는 목적으로 사용됨.
try:
print("999")
finally:
print("success")
try:
에러가 발생할 가능성이 있는 문장
except:
에러가 발생했을 때 실행할 문장
else:
에러가 발생하지 않았을 때 실행할 문장
finally:
에러 발생 여부와 관계없이 반드시 실행할 문장
'''
예외 처리
'''
print("1>")
try:
#1. ZeroDivisionError 발생 가능한 코드
n = 0
result = 50 / n
print("result", result)
# 2. IndexError 발생 가능한 코드
x = [10,20,30]
print(x[10])
# 문장
# ..
# 1. 방법: 다중 except로 해결 ( 권장 )
except ZeroDivisionError as e:
print("0으로 나누어서 예외가 발생", e)
except IndexError as e:
print("리스트 잘못 접근", e)
except Exception as e: # 관례적으로 가장 마지막에는 Exception 으로 처리한다. 예상하지 못했던 예외발생시 처리할 수 있다. ( 안전판 )
print("예외발생됨")
# 2 방법: 부모 예외클래스로 해결 ( 권장안함 )
# except Exception as e:
# print("예외발생됨")
print("end 정상종료")
단, 가장 상위 에러 클래스인 Exception 부모클래스 하나만 쓰면
무슨 이유로 에러가 발생한 것 인지 모를 수 있기 때문에 권장하지 않는다.
'''
예외 처리
'''
import traceback
print("1>")
try:
#1. ZeroDivisionError 발생 가능한 코드
n = 0
result = 50 / n
print("result", result)
# 2. IndexError 발생 가능한 코드
x = [10,20,30]
print(x[10])
# 문장
# ..
# 1. 방법: 다중 except로 해결 ( 권장 )
except ZeroDivisionError as e:
print("0으로 나누어서 예외가 발생", e) # division by zero
print(traceback.format_exc())
except IndexError as e:
print("리스트 잘못 접근", e)
print(traceback.format_exc())
except Exception as e: # 관례적으로 가장 마지막에는 Exception 으로 처리한다. 예상하지 못했던 예외발생시 처리할 수 있다. ( 안전판 )
print("예외발생됨")
print(traceback.format_exc())
# 2 방법: 부모 예외클래스로 해결 ( 권장안함 )
# except Exception as e:
# print("예외발생됨")
print("end 정상종료")
일반적으로 에러가 발생하면 빨간색 글씨로 에러가 뜨는데
traceback 패키지를 import 해주면 에러가 발생된 줄이 몇 번째 줄인지
흰 색 글씨로 콘솔창에 함께 출력된다.
'python' 카테고리의 다른 글
| [python] 파일 처리 (0) | 2022.09.28 |
|---|---|
| [python] 날짜 데이터 (0) | 2022.09.27 |
| [python] 강제성 부여 추상클래스 | 매직 메서드 (0) | 2022.09.26 |
| [python] class 메서드 오버라이딩 (0) | 2022.09.26 |
| [python] class 상속 (inheritance) (0) | 2022.09.26 |