본문 바로가기
Python/Python 기초

[Python] 예외처리

by snow_white 2022. 3. 15.

오류의 종류

  • 프로그램 실행 전에 발생하는 오류Syntax Error
  • 괄호 갯수, 들여쓰기 문제 등등
  • 프로그램 실행 중에 발생하는 오류예외, Exception
  • 프로그램 실행 중 function 안에서 줄 단위로 발생
    정상 종료 = 0
    비정상 종료 = -1
# 입력으로 문자를 넣으면 비정상 종료됨!
r = int(input("숫자입력: "))
print('원둘레', r * 3.14* 2)

 

try except

실행시간에 에러가 발생하여 코드가 중단되는 것을 방지할 때 사용

try:
   예외가 발생할 가능성이 있는 코드

except:
   예외 발생시 처리해야 하는 코드
   프로그램이 비정상종료 되는 것만 막으면 된다면 이곳에 아무것도 입력하지 않고 pass만 입력
try:
    r = int(input("숫자입력: ")) #예외 발생 가능성 있는 코드
    print('원둘레', r * 3.14* 2)
    
except:    # 예외가 발생하면 이곳으로 코드가 이동하고 / 여기서 예외발생시 처리코드입력
    print('숫자로 입력 하세요!!')

try~except만 사용하는 방법

  • 발생 오류만 포함한 except문
try:
    a = [1,2,3,4]
    print('try....')
    print(a[5])
    
except IndexError:
    print('except..as')

try~except만 사용하는 방법

  • except 발생 오류 as 오류 메시지 변수:
try:
    a = [1,2,3,4]
    print('try....')
    print(a[5])
    
except IndexError as e: # 발생한 에러의 객체를 e로 받아옴
    print('except..as')
    print(IndexError) # <class 'IndexError'>
    print(e) # list index out of range    에러 메세지 출력

try~except만 사용하는 방법

  • try문 안에서 여러 개의 except 구문 사용하기
try:
    a = [1,2]
    print(a[3])
    4/0             # 윗라인에서 예외가 발생했기 때문에 이부분까지는 못왔다.
except ZeroDivisionError:  
    print("0으로 나눌 수 없습니다.")
except IndexError:
    print("인덱싱 할 수 없습니다.")

try~except만 사용하는 방법

  • 다음과 같이 ZerroDivisionError와 IndexError를 함께 처리할 수도 있다.
try:
    a = [1,2]
    print(a[3])
    4/0
except (ZeroDivisionError, IndexError) as e:
    print(e)

try except else 사용하는 방법

  • 제어문과 함께 사용하기
  • try except else 구문을 사용할 때는 예외 발생 가능 코드만 try 구문 내부에 넣고
    나머지를 모두 else구문으로 빼는 경우가 많다
  • try : 예외 발생 가능성 있는 코드 except : 예외 발생시 실행할 코드 else : 예외가 발생하지 않았을 때 실행할 코드
try:
    age=int(input('나이를 입력하세요: '))
except:
    print('입력이 정확하지 않습니다.')
else:
    if age <= 18:
        print('미성년자는 출입금지입니다.')
    else:
        print('환영합니다.')

try except else finally 사용하는 방법

    try :
        예외 발생 가능성 있는 코드
    except :
        예외 발생시 실행할 코드
    else :
        예외가 발생하지 않았을 때 실행할 코드

    finally:
        예외와 상관없이 무조건 실행되어야 하는 코드
def divide(a,b):
    return a/b

try:
    c = divide(5, 0)
    # c = divide(5, 'stirng')
except ZeroDivisionError:
    print('두 번째 인자는 0이여서는 안됩니다.')
except TypeError:
    print('모든 인자는 숫자여야 합니다.')
except:
    print('음 무슨 에러인지 모름.')
else:
    print('Result : {0}.'.format(c))
finally: # 자원 close 할 때 필요함!
    print("이부분은 항상 실행됩니다.")

 

사용자 정의 예외 클래스 사용하기

raise 구문 정의

사용자가 강제로 예외를 일으킬 때 사용하는 구문

 

def raiseErrorFunc():
    raise NameError
    
try:
    raiseErrorFunc()
except:
    print('NameError is Catched')
    
>> NameError is Catched

내장 예외만으로는 한계가 있기 때문에 사용자 정의 예외를 정의할 수 있다.

 

class NegativeDivisionError(Exception):
    def __init__(self, value):
        self.value = value
        
def positiveDivide(a,b):
    if(b<0):
        raise NegativeDivisionError(b)
    return a/b    
    
    
try:
    ret = positiveDivide(10,-3)
    print('10/3={0}'.format(ret))
except NegativeDivisionError as e:
    print('Error -Second argument of positiveDivide is', e.value)
except ZeroDivisionError as e:    
    print('Error -',e.args[0])
    
>> Error -Second argument of positiveDivide is -3

댓글