파이썬 독학/입문 강의

[파이썬독학강의] 17. 예외처리(Exception Handling)

데니 by danny 2023. 5. 27. 00:32
반응형

예외처리(Exception Handling)
예외처리(Exception Handling)

 

님들 안녕하세요. 14년 차 IT 개발자 데니예요. 이번 시간에는 예외 처리(Exception Handling)에 대해서 학습해 볼게요. 예외 처리는 프로그램 동작 중 발생하는 예외적인 상황에 대비하여 미리 해당 예외에 대한 처리 방법을 정의하고 프로그램 실행을 계속해서 할 수 있도록 도와주는 기능이라고 할 수 있어요. 프로그램 소스 코드의 규모가 커지고 복잡성이 높아지면 그에 비례하여 예외 상황 발생 가능성도 높아질 수밖에 없어요.  이런 상황에서 예외 처리를 통해 오류 발생 시 프로그램이 중단되는 것을 방지하고, 오류에 대한 정보를 수집하거나 로그로 기록을 남길 수 있어요. 이를 통해 프로그램의 안정성과 신뢰성을 높일 수 있어요. 적절한 예외 처리 방법을 선택하고 구현하는 것은 프로그램 개발 과정에서 매우 중요한 부분이이므로 꼭 님들 것으로 만드시길 바라요. 자 그럼 예외처리 강의 시작해 볼게요!

 

 

 

 

17. 예외처리(Exception Handling)

  ▶ 예외처리란?

오류가 발생하였을 때 오류를 그대로 수행시키지 않고, 오류에 대응하는 방법을 제시한 개념이라고 할 수 있어요. 또한, 프로그램 수행 중 특정 문제가 발생하였을 때 미리 정의해 둔 방식으로 해당 문제를 처리하기 위한 프로그래밍 방법이에요.

 

예외처리 하는 경우
예외처리 하는 경우

예외처리 하는 경우:

  ①오류 발생  ②문제 직면 ③1과 2 모두 해당

 

 

  ▶ 일반적인 예외 살펴보기

일반적인 예외 3가지를 살펴보면서 예외란 무엇인지 더 구체적으로 알아볼게요.

 

1. ZeroDivisionError

 0을 다른 숫자로 나누는 경우 발생하는 오류

 

1
2
3
4
5
>>> 5/0
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
ZeroDivisionError: division by zero
>>>
cs

 

위의 코드에서는 50으로 나누려고 시도하였으며, 이는 ZeroDivisionError라는 예외가 발생한 것을 나타내고 있어요. 이 예외는 0으로 나누는 경우에 발생하는 오류예요.

 

2. IndexError

시퀀스 자료형(문자열, 튜플, 리스트)에서 인덱스 범위를 초과한 경우 발생하는 오류

 

1
2
3
4
5
6
>>> lst = [1234]
>>> lst[4]
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
IndexError: list index out of range
>>>
cs

 

위의 코드에서는 리스트 lst에서 존재하지 않는 인덱스에 접근하려고 시도하고 있어서 IndexError 예외가 발생한 것을 나타내고 있어요. 인덱스는 0부터 리스트의 길이보다 작은 값을 가져야 유효하며, 이를 벗어나는 인덱스에 접근하면 IndexError가 발생해요.

 

 

3. FileNotFoundError

지정된 경로의 파일을 찾을 수 없는 경우 발생하는 오류

 

1
2
3
4
5
>>> f = open('C:/차주로또1등번호.txt', 'r')
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
FileNotFoundError: [Errno 2] No such file or directory: C:/ 차주로또1등번호.txt
>>>
cs

 

위의 코드에서는 open() 함수를 사용하여 'C:/차주로또1등번호.txt' 파일을 읽기 모드로 열려고 시도하고 있어요. 그러나 해당 경로에 파일이 존재하지 않기 때문에 FileNotFoundError 예외가 발생한 것을 나타내고 있어요.

파일을 다룰 때 파일 경로와 이름을 정확히 지정해야 하며, 해당 경로에 실제로 파일이 존재해야 해요. 파일이 존재하지 않거나 경로가 잘못된 경우에는 FileNotFoundError 예외가 발생해요.

 

 

  ▶ 예외 처리 방법

예외 처리는 try-except 을 사용하여 구현됩니다. try 블록 안에 예외가 발생할 수 있는 코드를 작성하고, except 블록 안에는 해당 예외가 발생했을 때 실행될 코드를 작성합니다.

 

다음은 파이썬 예외 처리의 기본적인 구조입니다:

try:
    # 예외가 발생할 수 있는 코드
except 발생 오류 as 오류 메시지 변수:
    # 예외 처리 코드
except 발생 오류 as 오류 메시지 변수:
    # 예외 처리 코드
else:
    # 예외가 발생하지 않았을 때 실행되는 코드
finally:
    # 예외 발생 여부와 상관없이 항상 실행되는 코드

 

예외 처리의 기본 구조에 대해 자세히 설명하면 다음과 같습니다:

 

▷ try 블록 : 예외가 발생할 수 있는 코드를 포함하는 블록이에요. 이 블록 안에서 예외가 발생하면 해당 예외에 대한 처리를 하except 블록으로 넘어가요.

 

▷ except 블록: 특정 예외가 발생했을 때 처리하는 블록이에요. except 키워드 다음에는 처리할 예외의 종류를 명시하고, as 키워드를 사용하여 예외 메시지를 받을 변수를 지정할 수 있어요. 여러 개의 except 블록을 사용하여 다양한 예외를 처리할 수 있어요.

 

▷ else 블록 (선택적): try 블록 안의 코드에서 예외가 발생하지 않았을 때 실행되는 블록이에요. 이 블록은 예외가 발생하지 않았을 때 추가적인 동작을 수행하고 싶을 때 사용할 수 있어요.

 

▷ finally 블록 (선택적): 예외 발생 여부와 상관없이 항상 실행되는 블록이에요. 보통은 리소스 정리나 마무리 작업 등을 위해 사용돼요.

 

 

▶ try-except문 사용하여 예외처리 하기

try:
    lst = [1, 2, 3, 4, 5]
    print(lst[4] / 0)
except ZeroDivisionError as e:
    print(f"0으로 나누기는 불가능합니다. \n오류 내용: {e}")

 

위의 예시에서는 try 블록 안에서 50으로 나누려고 시도하고 있어요. 그러나 ZeroDivisionError가 발생하면 해당 예외를 처리하는 except 블록이 실행돼요. 이 경우에는 "0으로 나눌 수 없습니다."라는 메시지가 출력돼요.

이렇게 예외 처리를 통해 예외 상황을 감지하고 적절한 조치를 취할 수 있어요. 이를 통해 프로그램의 실행이 중단되는 것을 방지하고, 오류에 대한 대응을 할 수 있어요.

 

 

▶ try-except-except문 사용하여 예외처리 하기

try:
    lst = [1, 2, 3, 4, 5]
    print(lst[5] / 0)
except ZeroDivisionError as e:
    print(f"0으로 나누기는 불가능합니다. \n오류 내용: {e}")
except IndexError as e:
    print(f"인덱스가 존재하지 않습니다. \n오류 내용: {e}")

 

위의 코드에서는 try 블록 안에서 lst[5] / 0을 계산하려고 시도하고 있어요. 그러나 인덱스 5lst의 범위를 벗어나기 때문에 IndexError가 발생해요. 먼저 발생한 예외에 대한 처리를 하는 except ZeroDivisionError 블록은 실행되지 않고, 다음으로 except IndexError 블록이 실행돼요. 각각의 except 블록에서는 해당 예외에 대한 처리를 수행하고, 예외 메시지를 출력해요.

위의 코드에서는 IndexError가 발생하였기 때문에 except IndexError 블록이 실행되고, "인덱스가 존재하지 않습니다."라는 메시지와 함께 예외 메시지가 출력돼요.

 

 

▶ try-except-else문 사용하여 예외처리 하기

print('두 수를 각각 입력하세요.')
print('두 수를 가지고 나누기를 합니다.')

while True:
    fir_num = input('첫번째 숫자를 입력하세요: ')
    if fir_num == 'q':
        break
    sec_num = input('두번째 숫자를 입력하세요: ')
    if sec_num == 'q':
        break

    try:
        answer = int(fir_num) / int(sec_num)
    except ZeroDivisionError as e:
        print(e)
    else:
        print(answer)

 

위의 코드는 먼저 "두 수를 각각 입력하세요.""두 수를 가지고 나누기를 합니다."라는 메시지를 출력해요.

 

그런 다음 while 루프를 사용하여 계속해서 사용자로부터 숫자를 입력받아요. 사용자가 'q'를 입력하면 루프가 종료돼요.

 

try 블록 안에서는 입력받은 숫자들을 int() 함수를 사용하여 정수로 변환하고, 변환된 숫자들을 나눗셈 연산에 활용해요. 이때, ZeroDivisionError 예외가 발생할 수 있어요.

 

except ZeroDivisionError 블록은 0으로 나누기 오류가 발생했을 때 실행되며, 해당 예외에 대한 처리를 수행합니다. 예외 메시지가 출력돼요.

 

else 블록은 예외가 발생하지 않았을 때 실행되며, 나눗셈 결과가 출력돼요.

 

이렇게 코드를 작성하면 사용자로부터 숫자를 입력받아 나눗셈을 수행하며, 0으로 나누기 오류에 대한 예외 처리를 할 수 있어요. 사용자가 'q'를 입력하여 프로그램을 종료할 수 있어요.

 

 

▶ try-except-except-else-finally문 사용하여 예외처리 하기

try:
    # 예외가 발생할 수 있는 코드
    result = 10 / 0
except ZeroDivisionError as e:
    # ZeroDivisionError 예외 처리
    print(f"0으로 나누기는 불가능합니다. 오류 메시지: {e}")
except ValueError as e:
    # ValueError 예외 처리
    print(f"잘못된 값입니다. 오류 메시지: {e}")
else:
    # 예외가 발생하지 않았을 때 실행되는 코드
    print("예외가 발생하지 않았습니다.")
finally:
    # 예외 발생 여부와 상관없이 항상 실행되는 코드
    print("종료합니다.")

 

위의 코드에서는 try 블록 안에서 100으로 나누려고 시도하고 있어요. 이는 ZeroDivisionError 예외를 발생시켜요. 따라서 except ZeroDivisionError 블록이 실행되고, 해당 예외에 대한 처리를 수행해요. else 블록은 실행되지 않아요. 마지막으로 finally 블록이 항상 실행되어 "종료합니다."라는 메시지를 출력해 줘요..

 

 

  ▶ 예외 생성하기

파이썬에서는 사용자가 직접 예외를 만들어서 처리할 수 있어요. 예외를 만들기 위해서는 Exception 클래스를 상속받아 새로운 예외 클래스를 정의해야 해요. 이렇게 정의된 예외 클래스는 기존의 내장 예외 클래스와 마찬가지로 사용자가 원하는 시점에 예외를 발생시킬 수 있어요.

 

class MyCustomException(Exception):
    def __init__(self, message):
        self.message = message

    def __str__(self):
        return f"My Custom Exception: {self.message}"

def divide(a, b):
    if b == 0:
        raise MyCustomException("0으로 나눌 수 없습니다.")
    return a / b

try:
    result = divide(10, 0)
    print(result)
except MyCustomException as e:
    print(e)

 

위의 코드에서는 MyCustomException이라는 사용자 정의 예외 클래스를 정의하고 있어요. 이 예외 클래스는 Exception 클래스를 상속받아 필요한 메서드를 오버라이딩했어요. __init__ 메서드는 예외 객체를 생성할 때 호출되는 생성자이며, __str__ 메서드는 예외 객체를 문자열로 표현하기 위해 호출돼요.

 

divide 함수는 두 숫자를 나누는 함수로, 만약 두 번째 인자인 b0일 경우 MyCustomException을 발생시켜 줘요.

 

try-except 문에서는 divide 함수를 호출하고, 발생한 예외가 MyCustomException일 경우 예외 객체를 e 변수로 받아와서 처리해 줘요. 이후 해당 예외 객체를 출력해요.

 

위의 예시 코드를 실행하면 0으로 나누기 오류가 발생하여 MyCustomException이 발생하고, 예외 객체의 내용이 출력돼요. 이처럼 사용자 정의 예외를 만들어서 프로그램의 특정 상황에서 예외를 발생시킬 수 있고, 이에 대한 처리를 수행할 수 있어요.

 

 

님들 여기까지 파이썬 예외처리에 대한 강의를 마무리하고자 해요. 예외 처리는 프로그램의 안정성과 신뢰성을 높이는 데 중요한 역할을 해요. 적절한 예외 처리를 통해 예외 상황을 감지하고 대응할 수 있도록 하는 것이 좋아요. 예외 처리를 통해 프로그램이 예외 상황에서도 예측 가능하고 제어 가능한 동작을 보장할 수 있어요.

이상으로 파이썬 예외처리에 대한 강의를 마무리할게요. 더 궁금한 점이 있다면 언제든지 dannyeducation1@gmail.com로 문의해 주세요. 감사해요.

반응형