파이썬 강좌(초급)/9.예외처리

9.예외처리 - 1) 개요

파기차차 2024. 4. 7. 15:57
728x90
반응형
SMALL

 

 

1) 예외처리가 뭐에요?

예외처리는 어떤 에러나 오류 발생시 처리하는 방법을 말합니다.

, 프로그램에서 발생하는 에러 대신 사용자가 알아보기 쉽도록 지정하여 에러를 발생시킬 수 있고 적절히 처리할 수 있는데, 이걸 예외처리라고 합니다.

 

예외 처리는 try, except, finally 등의 키워드를 사용하여 구현됩니다. 기본적인 예외 처리 구조는 다음과 같습니다

try:
    # 예외가 발생할 가능성이 있는 코드(, 일반 코드)
    # 예를 들어, 파일을 열거나 네트워크 연결을 시도하는 코드 등
    result = 10 / 0  # ZeroDivisionError 발생 예시
except Exception as e:
    # 예외가 발생했을 때 실행되는 코드
    # 발생한 예외에 따라 처리 로직을 구현할 수 있습니다.
    print(f"예외가 발생했습니다: {e}")
finally:
    # 예외 발생 여부와 관계없이 항상 실행되는 코드
    # 리소스를 정리하는 등의 작업에 활용될 수 있습니다.
    print("예외 처리가 완료되었습니다.")

예외가 발생했습니다: division by zero

예외 처리가 완료되었습니다.

 

위의 코드에서는 0으로 나누는 작업을 시도하고 있기 때문에 ZeroDivisionError가 발생할 것입니다. try 블록 안에서 이 예외가 발생하면 except 블록이 실행되고, finally 블록은 예외 발생 여부와 관계없이 항상 실행됩니다.

 

 

 

2) 예외처리를 사용하는 이유가 뭐죠?

 

주로 아래와 같은 이유로 예외처리를 사용합니다.

(1) 예외 처리를 사용하면 예기치 않은 상황에서도 프로그램이 강제 종료되는 것을 방지할 수 있습니다

(2) 예외 처리를 통해 오류가 발생했을 때 사용자에게 적절한(쉬운) 오류 메시지를 제공할 수 있습니다. 이는 사용자가 오류 상황을 이해하고 문제를 해결하는 데 도움이 됩니다.

 

 

 

아래는 계산기에 숫자를 입력하는 프로그램에 숫자를 입력해 보겠습니다.

print("계산기입니다.")
num1 = int(input("첫번째 숫자 입력 : "))
num2 = int(input("두번째 숫자 입력 : "))
print(str(num1) + " / " + str(num2) + " = ", int(num1/num2))

계산기입니다.

첫번째 숫자 입력 : 4

두번째 숫자 입력 : 2

4 / 2 =  2

>위에서는 숫자 ‘4’와 숫자 ‘2’를 입력하여 나눠서 정상적으로 에러 없이 ‘2’ 가 나왔습니다.

 

 

 

하지만 아래와 같이 숫자 ‘2’가 아닌 문자 입력하는 경우 아래와 같이 에러가 발생합니다.

계산기입니다.

첫번째 숫자 입력 : 4

두번째 숫자 입력 :

Traceback (most recent call last):

  File "C:\python\imsi\imsi.py", line 6, in <module>

    num2 = int(input("두번째 숫자 입력 : "))

           ^^^^^^^^^^^^^^^^^^^^^^^^^^

ValueError: invalid literal for int() with base 10: ''

 

따라서 아래와 같이 except 구문에 위에서 발생한 ‘ValueError’ 로 예외처리 해 줄 수 있습니다.

(, ‘ValueError가 발생하면 except 구문을 실행해..)

try:
    print("계산기입니다.")
    num1 = int(input("첫번째 숫자 입력 : "))
    num2 = int(input("두번째 숫자 입력 : ")) # 문자 입력시 에러 발생
    print(str(num1) + " / " + str(num2) + " = ", int(num1/num2))
except ValueError:
    print("에러 발생")

계산기입니다.

첫번째 숫자 입력 : 4

두번째 숫자 입력 :

에러 발생

위 코드 실행시 '4/이' 를 실행하려 하므로 ValueError가 발생하고, ValueError가 위치한 except 이하 구문이 실행되어 에러 발생이라고 출력하였습니다.

 

 

하지만 다시 아래와 같이 두번째 숫자를 ‘0’으로 나누는 경우 ZeroDivisionError 에러가 발생하게 됩니다.

계산기입니다.

첫번째 숫자 입력 : 4

두번째 숫자 입력 : 0

Traceback (most recent call last):

  File "C:\python\imsi\imsi.py", line 15, in <module>

    print(str(num1) + " / " + str(num2) + " = ", int(num1/num2))

                                                     ~~~~^~~~~

ZeroDivisionError: division by zero

 

아래와 같이 다시 ZeroDivisionError 을 사용하여 예외처리 해 줄 수 있습니다.

try:
    print("계산기입니다.")
    num1 = int(input("첫번째 숫자 입력 : "))
    num2 = int(input("두번째 숫자 입력 : "))
    print(str(num1) + " / " + str(num2) + " = ", int(num1/num2))
except ValueError:
    print("에러 발생")
except ZeroDivisionError as err: # 0으로 나눌시 에러 발생
    print(err)

계산기입니다.

첫번째 숫자 입력 : 4

두번째 숫자 입력 : 0

division by zero

위 코드 실행결과 0으로 나누었지만 일반 오류가 발생하지 않고, 우리가 예외처리 해준 ZeroDivisionError 가 포함된 except 구문 이하가 실행되었고, 에러 메시지를 보여주기 위해서 print(err) 로 에러 메시지(division by zero )를 보여주고 있습니다.

 

 

아래와 같은 에러가 발생하는 경우가 있는데, 이는 리스트의 개수가 2개인데, 3번째 리스트 요소(nums[2])를 가져오려 하면서 발생하는 인덱스 오류입니다.

 try:
    print("계산기입니다.")
    nums = []
    nums.append(int(input("첫번째 숫자 입력 : ")))
    nums.append(int(input("두번째 숫자 입력 : ")))
    # print(nums)
    # nums.append(int(nums[0] / nums[1])) ß 이걸 깜빡하고 누락함
    print(str(nums[0]) + " / " + str(nums[1]) + " = ", int(nums[2]))
except ValueError:
    print("에러 발생")
except ZeroDivisionError as err: # 0으로 나눌시 에러 발생
    print(err)

계산기입니다.

첫번째 숫자 입력 : 4

두번째 숫자 입력 : 2

Traceback (most recent call last):

  File "C:\python\imsi\imsi.py", line 40, in <module>

    print(str(nums[0]) + " / " + str(nums[1]) + " = ", int(nums[2]))

                                                           ~~~~^^^

IndexError: list index out of range

 

아래 코드와 같이 except로 처리하면 그(ValueError, ZeroDivisionError) 외 모든 에러(파이썬에서 알 수 있는 에러 + 파이썬에서 알 수 없는 에러)에 대한 처리가 가능합니다.

try:
    print("계산기입니다.")
    nums = []
    nums.append(int(input("첫번째 숫자 입력 : ")))
    nums.append(int(input("두번째 숫자 입력 : ")))
    # print(nums)
    # nums.append(int(nums[0] / nums[1]))
    print(str(nums[0]) + " / " + str(nums[1]) + " = ", int(nums[2]))
except ValueError:
    print("에러 발생")
except ZeroDivisionError as err: # 0으로 나눌시 에러 발생
    print(err)
except:
    print("알수 없는 에러가 발생하였습니다.")

계산기입니다.

첫번째 숫자 입력 : 4

두번째 숫자 입력 : 2

알수 없는 에러가 발생하였습니다.

 

 

아래 코드의 경우 Exception 을 사용하여 파이썬에서 발생한 모든 예외를 처리할 수 있습니다.

(IndexError를 사용한다면 인덱스에러만 처리)

try:
    print("계산기입니다.")
    nums = []
    nums.append(int(input("첫번째 숫자 입력 : ")))
    nums.append(int(input("두번째 숫자 입력 : ")))
    # print(nums)
    # nums.append(int(nums[0] / nums[1]))
    print(str(nums[0]) + " / " + str(nums[1]) + " = ", int(nums[2]))
except ValueError:
    print("에러 발생")
except ZeroDivisionError as err: # 0으로 나눌시 에러 발생
    print(err)
except Exception as err: # 모든 예외를 처리
    print(err)
#except IndexError as err: # IndexError만 예외를 처리
#   print(err)
except:
    print("알수 없는 에러가 발생하였습니다.")

계산기입니다.

첫번째 숫자 입력 : 4

두번째 숫자 입력 : 2

list index out of range

 

위의 경우 Exception as err을 사용하여 구문내 print(err)로 발생한 인덱스에러에 대한 예외처리를 하고, ‘list index out of range’ 메시지를 보여주고 있습니다.

 

 

 

 

 

2)실습

 

(1) 문자열 PER (Price to Earning Ratio) 값을 실수로 변환할 때 에러가 발생합니다. 예외처리를 통해 에러가 발생하는 PER은 0으로 출력하세요.

per = ["10.31", "", "8.00"]

for i in per:
    print(float(i))

 

 

모범답안

더보기
per = ["10.31", "", "8.00"]

for i in per:
    try:
        print(float(i))
    except:
        print(0)

 

 

 

(2) 문자열로 표현된 PER 값을 실수로 변환한 후 이를 새로운 리스트에 저장해보세요.

per = ["10.31", "", "8.00"]

for i in per:
    print(float(i))

 

 

 

모범답안

더보기
per = ["10.31", "", "8.00"]
new_per = []

for i in per:
    try:
        v = float(i)
    except:
        v = 0
    new_per.append(v)

print(new_per)
728x90
반응형
LIST