본문 바로가기
python

[python]파이썬 - 오류 예외처리

by skysline 2023. 1. 24.
반응형

구문적 오류(Syntax Error)

  • 문법 오류에 의하여 기계어 변환 과정에서 발생하는 오류
 
 
def do_func:
    print("hello")
 
 
 
 

실행 오류(Runtime Error)

  • 프로그램 실행중 발생하여 프로그램이 비정상적으로 종료되는 오류
 
 
def do_func(text):
    return int(text)

text = "3"
do_func(text)
 
3
 
text = "3.0"
do_func(text)
 
 
def div(n1,n2):
    return n1/n2
div(10,0)
 
 
 

의미적 오류(Semantic Error)

  • 문법은 정상이지만 실행의 결과가 원하는 대로 나오지 않는 오류
 
a = (2)
b = (2,)

a == b
 
False
def do_func(n1,n2):
    return print(n1*n2)

a = do_func(3,4)
print(a)
 
12
None
 
7.5 * 0.1 == 0.75
 
True
 
6 * 0.1 == 0.6
 
False
 
6 * 0.1
 
0.6000000000000001
 
round(6*0.1,1) == 0.6
 
True
 

예외처리

  • 프로그램 개발하면서 예상치 못한 상황 발생시 처리
  • 입출력 오류와 같은 상황 발생시 프로그램 종료를 방지하기 위함.
  • 개발자가 예외 발생 가능 부분을 어떻게 대응하라고 지정해 줄 수 있다.
try:
    code context
except:
    code context
 
n = 100
for i in range(10):
    print(n/i)
 
 
n = 100
for i in range(10):
    try:
        print(n/i)
    except:
        print("에러발생")
 
에러발생
100.0
50.0
33.333333333333336
25.0
20.0
16.666666666666668
14.285714285714286
12.5
11.11111111111111
 
  • 에러를 지정해서 메시지를 볼수있다.
 
n = 100
for i in range(10):
    try:
        print(n/i)
    except ZeroDivisionError as e:
        print(e)
 
division by zero
100.0
50.0
33.333333333333336
25.0
20.0
16.666666666666668
14.285714285714286
12.5
11.11111111111111
 
  • IndexError
    • 리스트의 인덱스 범위를 넘어갈때 발생
a = [1,2,3]
a[5]
 
 
  • NameError
    • 정의되지 않은 변수를 사용하려 할때
karns
 
 
 
  • ValueError
    • 변환할수 없는 자료형 변환을 시도 할때
 
a = "양승천"
int(a)
 
 
 
  • TypeError
    • 자료형이 맞지 않는 연산을 시도할때
    • 호출할수 없는 객체를 함수처럼 호출할때
 
20 / "양승천"
 
 
a = 3
a()
 
 
 
  • FileNotFoundError
    • 없는 파일을 읽어드리려 할때
 
open("text.txt")
 
 
 
  • AttributeError
    • 객체에 없는 속성을 사용하려 할때
class MyClass:
    def do_func(self):
        self.a = self.a + 2
mc = MyClass()
mc.do_func()
 
 
 
- 리스트 형태의 데이터가 있다.
- 정수형으로 변환해서 새로운 리스트에 담자.
- 정수형으로 변환이 안되는 예외 발생시 "정수형으로 변환되지 않습니다." 
라는 출력과 함께 실수로 변경해서 다시 정수형으로 변경하는 코드를 작성해봅시다.
 
 
 
lst = ["3","5","3.","3.0","10"]
num_list = []

for i in lst:
    try:
        num_list.append(int(i))
    except ValueError as e:
        print("정수형으로 변환되지 않습니다.")
        num_list.append(int(float(i)))

num_list
 
정수형으로 변환되지 않습니다.
정수형으로 변환되지 않습니다.
[3, 5, 3, 3, 10]
 
  • 여러개의 예외가 발생할수 있거나 어떤 예외가 발생할지 알수 없을때
 
try:
    open("text.txt")
    a = 5 / 0
except Exception as e:
    print(e)
 
[Errno 2] No such file or directory: 'text.txt'
 
  • else 문
    • 해당 예외가 발생하지 않을 경우 수행할 코드
 
n = 100
for i in range(10):
    try:
        result = n/i # 에러발생 여부 있음
    except ZeroDivisionError as e:
        print(e)
    else:
        result **= 2
        print(result)
 
division by zero
10000.0
2500.0
1111.1111111111113
625.0
400.0
277.7777777777778
204.08163265306123
156.25
123.45679012345678
 
  • finally 문
    • 예외 발생여부와 상관없이 무조건 수행할 코드
 
 
 
for n in range(3):
    try:
        result = 100/n
    except ZeroDivisionError as e:
        print(e)
    else:
        print("정상적으로 연산되었습니다.")
    finally:
        print("처리완료")
 
division by zero
처리완료
정상적으로 연산되었습니다.
처리완료
정상적으로 연산되었습니다.
처리완료
 
  • 정리해보자
    try:
      예외 발생 가능성이 있는 실행 코드
    except:
      예외 발생시 실행 코드
    else:
      예외 발생하지 않았을 경우 실행코드
    finally:
      예외 발생 여부와 상관없이 항상 실행할 코드
 
- 숫자형태의 문자열을 담은 리스트가 있다.
- 정수형으로 변환해서 새로운 리스트에 담자.
- 정수형으로 변환시 예외가 발생하지 않을 경우 "정상적으로 정수형으로 변경합니다." 출력
- 정수형으로 변환이 안되는 예외 발생시
"정수형으로 변환되지 않습니다. 실수형으로 변환후에 시도하겠습니다." 라는 출력과 함께
실수형으로 변경해서 다시 정수형으로 변경하는 코드를 작성
- 예외 발생여부와 상관없이 "정수형으로 변환 및 저장 완료" 를 출력
 
정상적으로 정수형으로 변경합니다.
정수형으로 변환 및 저장 완료
정상적으로 정수형으로 변경합니다.
정수형으로 변환 및 저장 완료
정수형으로 변환되지 않습니다. 실수형으로 변환후에 시도하겠습니다.
정수형으로 변환 및 저장 완료
정수형으로 변환되지 않습니다. 실수형으로 변환후에 시도하겠습니다.
정수형으로 변환 및 저장 완료
정상적으로 정수형으로 변경합니다.
정수형으로 변환 및 저장 완료
[3, 5, 3, 3, 10]
 
  • raise 문
    • 필요할때 에러를 발생 시키는 코드
    • if문과 함께 많이 사용된다.
 
 
 
num = 0
if num == 0:
    raise ValueError
 
 
 
  • 메세지도 넣을수 있다.
 
 
 
num = 0 
if num == 0:
    raise ValueError("0으로 나눌수 없어요.")

 

두개의 정수를 인수로 받아 두수를 나누는 함수를 작성하세요
두번째 인수가 1보다 작을 경우 ValueError 발생시키고 "1이상의 정수만 입력하세요" 라고 출력하세요.
 
def div(num1,num2):
    if num2 < 1:
        raise ValueError("1이상의 정수만 입력하세요")
    return num1/num2

div(10,-1)
 
 
 
  • assert 문
    • 조건이 거짓일 경우 오류를 발생 시킴
 
1.0
반응형

댓글