Python/Python기초

Python 23_ Error, Exception

Codezoy 2019. 12. 20. 18:48


error, exception  : 프로그램 실행 중에 발생할 수 있는 오류

# prnit(1) # NameError : 없는 이름의 변수, 함수를 사용하려고 할 때 

# n = int('abc') # ValueError: invalid literal for int() with base 10: 'abc' : 데이터형 오류. 문자를 인트형으로 변환할 수 없음
# n = int('123.') # ValueError: invalid literal for int() with base 10: '123.'

# int(): 문자열 -> 정수
# float: 문자열 -> 실수

     numbers = [1, 2, 3]
     print(numbers[3])

>>IndexError: list index out of range  인덱스 번호가 범위를 벗어남


     print('123'+ 456)

>>TypeError: can only concatenate str (not "int") to str : 숫자와 문자 자료형은 더할 수 없다

     print(123/0)
>>ZeroDivisionError: division by zero : 0으로 나눌 수 없다


프로그램 실행중 오류가 발생했을 때 해결 방법:
1) 오류가 발생한 코드 위치를 찾아서 오류가 발생하지 않도록 수정

2) 오류가 발생하더라도, 오류를 무시하고 프로그램이 실행될 수 있도록
   프로그램을 작성 -> try 구문


try 구문:
try:
     실행할 문장들
except 에러종류 [as 별명]:
     에러가 발생했을 때 실행할 문장들
[except 다른에러: 코드]
[else:
     에러 없이 try 블록 안의 모든 문장이 정상적으로 실행됐을 때
     실행할 코드들]
[finally:
     에러 발생 여부와 상관 없이 반드시 실행할 문장들]


에러x : try -> else -> finally 
에러o : try -> except -> finally


     try:
          numbers = [1, 2, 3]
          for i, v in enumerate(numbers):
               print(i, ':', v)
     except IndexError:
          print('인덱스 에러 발생')


실행 결과
0 : 1
1 : 2
2 : 3


     try:
          numbers = [1, 2, 3]
     for i, v in enumerate(numbers):
          print(i, ':', v)
     except IndexError:
          print('인덱스 에러 발생')
     else:
          print('try의 모든 내용을 정상적으로 실행')
     finally:
          print('finally 블록')


실행 결과
0 : 1
1 : 2
2 : 3
try의 모든 내용을 정상적으로 실행
finally 블록


     try:
          numbers = [1, 2, 3]
          for i in range(1, 4):
               print(i, ':', numbers[i])
     except IndexError:
          print('인덱스 에러 발생')
     else:
          print('try의 모든 내용을 정상적으로 실행')
     finally:
          print('finally 블록')


실행 결과
1 : 2
2 : 3
인덱스 에러 발생
finally 블록



     try:
          numbers = [1, 2, 3]
          for i in range(1, 4):
               print(i, ':', numbers[i])
     except ValueError# 에러 이름이 잘못 됨
          print('인덱스 에러 발생')
     else:
          print('try의 모든 내용을 정상적으로 실행')
     finally:
          print('finally 블록')


실행 결과
IndexError: list index out of range
1 : 2
2 : 3
finally 블록


     try:
          numbers = [1, 2, 3]
          for i in range(1, 4):
               print(i, ':', numbers[i])
     except ValueError:
          print('값 에러 발생')
     except IndexError:
          print('인덱스 에러 발생')
     else:
          print('try의 모든 내용을 정상적으로 실행')
     finally:
          print('finally 블록')


실행 결과
1 : 2
2 : 3
인덱스 에러 발생
finally 블록


     """
     try-except 구문 활용
     """
     while True:
          try:
               n = int(input('정수 입력>>'))
               print('n = ', n)

          except ValueError:
               print('입력값은 정수여야 합니다!')
     print('프로그램 정상 종료')




>> 



# 사용자 정의 오류를 발생시키는 방법



"""
사용자 정의 오류를 발생시키는 방법
"""
     try:
          age = int(input('나이를 입력 >>'))
     if age < 0:
          raise ValueError('나이는 0 이상의 양의 정수여야 합니다.')
     print(f'입력한 나이 : {age}')
     except ValueError as e:
          print(e.args) # .args : 에러의 내용을 볼 수 있다.




     def user_input():
     """
     사용자에게 1, 2, 3 중 하나의 숫자를 입력하도록 안내.
     사용자가 입력한 숫자를 리턴
     사용자가 숫자로 변환할 수 없는 문자를 입력하면, 안내문 출력 후 다시 입력 받음.
     사용자가 1, 2, 3 이외의 숫자를 입력하면, 안내문 출력 후 다시 입력 받음.
     :return: 1, 2, 3 중의 하나를 리턴
     """
     while True:
          try:
               numbers = int(input('1, 2, 3 중 하나의 숫자를 입력 : '))
               if numbers>3 or numbers < 1:
                    raise ValueError
                    print(f'입력한 숫자 : {numbers}')
                    return numbers

     except ValueError as e:
          print('다시 입력하세요.')

     x = user_input()
     print(f"user_input():{x}")