haju__log

[python] 예외 처리 (try, except, exception, raise) 본문

코테관련 이론

[python] 예외 처리 (try, except, exception, raise)

haju 2023. 5. 1. 16:28
반응형

예외 처리

  • 문법
  • 예외의 이름을 알고 있다면 예외를 잡을 수 있다.
try :
	#에러가 발생할 가능성이 있는 코드
except Exception : #에러 종류
	#에러가 발생했을 경우 처리할 코드
  • 예제
text = '100%'
print(int(text))

ValueError 발생한 것을 확인할 수 있다.

text = '100%'
try:
    print(int(text))
except ValueError:
    print('{}는 숫자가 아니네요.'.format(text))

예러 나는 부분을 확인하여 try~except~ 사용

 

  • 경우에 따라 예외 처리 대신 if-else문을 사용할 수 있다. 
  • 둘 다 가능할 경우, 보통 코드가 간결한 쪽을 선택하면 됨
  • 예제
#예외가 발생하는지 미리 알아보기 위한 함수 만들기
#인덱스에 해당하는 값을 출력하고, 그 값을 리스트에서 지워주는 함수

def safe_pop_print(list,index):
    try:
        print(list.pop(index))
    except IndexError:
        print('{} index의 값을 가져올 수 없습니다.'.format(index))

safe_pop_print([1,2,3],5)
#위의 코드를 if-else문으로 바꿈

def safe_pop_print(list,index):
    if len(list)>index:
        print(list.pop(index))
    else:
        print('{} index의 값을 가져올 수 없습니다.'.format(index))

safe_pop_print([1,2,3],5)

 

  • try~except가 아니면 해결하기 어려운 에러가 생기는 경우
  • 예제
try :
    import my_module
except ImportError:
    print("모듈이 없습니다.")

 


✅ 예외(에러)의 이름을 모를 때

  • 문법
try:
    #에러가 발생할 가능성이 있는 코드
except Exception as ex: #에러 종류
    print("에러가 발생했습니다.",ex) #ex는 발생한 에러의 이름을 받아오는 변수
  • 예제1
try:
    list=[]
    print(list[0])
except Exception as ex:
    print("에러가 발생했습니다.",ex)

  • 예제2
try:
    text='abc'
    number=int(text)
except Exception as ex:
    print("에러가 발생했습니다.",ex)


✅ raise : 예외 발생

  • 사용자가 직접 에러를 발생시키는 기능
  • raise Exception # 에러 종류
  • 많이 사용하면 코드를 읽기 어려워진다.
def rsp(mine,yours): #가위바위보 승패를 판단하는 코드
    allowed = ['가위','바위','보']
    if mine not in allowed:
        raise ValueError
    if yours not in allowed:
        raise ValueError

rsp('가위','바')

에러를 발생시킴

def rsp(mine,yours): #가위바위보 승패를 판단하는 코드
    allowed = ['가위','바위','보']
    if mine not in allowed:
        raise ValueError
    if yours not in allowed:
        raise ValueError

try:
    rsp('가위','바')
except ValueError:
    print('잘못된 값을 넣은 것 같습니다.')

에러를 발생시킨 것을 보고 try~except문을 이용함

 

  • 예제
  • 조건문 : 1,2반이 있는 학교에서 190이 넘는 학생이 있으면 print문을 한 번만 출력하고 끝내고 싶음.
school = {'1반': [172,185,198,177,165,199],
          '2반': [165,177,167,180,191]}

for class_number, students in school.items():
    for student in students:
        if student>190:
            print(class_number,'반에 190을 넘는 학생이 있습니다.')
            break

➡ 이렇게 코드를 짜면 print문이 2줄 실행되므로 조건에 맞지 않음.

(break문이 for student in students:에서만 작동하기 때문에)

 

school = {'1반': [172,185,198,177,165,199],
          '2반': [165,177,167,180,191]}

for class_number, students in school.items():
    for student in students:
        if student>190:
            print(class_number,'반에 190을 넘는 학생이 있습니다.')
            raise StopIteration

➡ raise를 이용하면 1문장만 실행되고 에러를 발생시켜서 종료됨. 그러나 에러가 발생하지 않고 무사히 코드를 끝내야하므로, try~except 문을 이용해 다시 한번 코드를 수정해준다.

 

#최종 코드
school = {'1반': [172,185,198,177,165,199],
          '2반': [165,177,167,180,191]}
try:
    for class_number, students in school.items():
        for student in students:
            if student>190:
                print(class_number,'반에 190을 넘는 학생이 있습니다.')
                raise StopIteration
except StopIteration:
    print('정상종료')

반응형