파이썬 기초

예외처리

데이터_박과장 2023. 10. 11. 22:51

오류는 언제 발생하는가?


오류는 프로그램 실행 중에 예기치 않은 상황이나 잘못된 동작이 발생할 때 발생합니다. 이러한 상황은 다양한 이유로 발생할 수 있으며, 이러한 상황을 오류나 예외(Exception)라고 합니다.

오류 예외 처리 기법:

오류 예외 처리 기법은 예외가 발생할 수 있는 코드 블록을 둘러싸고, 예외가 발생할 때 적절한 조치를 취하는 방법입니다.

try-except 문:

try 블록 안에서 예외가 발생할 가능성이 있는 코드를 실행하고, 예외가 발생하면 except 블록에서 예외를 처리합니다.

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Division by zero is not allowed.")



try-finally 문:

try 블록 안에서 예외가 발생하더라도, finally 블록의 코드는 항상 실행됩니다. 주로 파일을 닫는 등의 정리 작업에 사용됩니다.

try:
    file = open("example.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("File not found.")
finally:
    file.close()



여러 개의 오류 처리하기:

여러 종류의 예외를 처리할 때 except 블록을 여러 개 사용할 수 있습니다.

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Division by zero is not allowed.")
except ArithmeticError:
    print("Arithmetic error occurred.")



try-else 문:

try 블록에서 예외가 발생하지 않으면 else 블록이 실행됩니다.

try:
    result = 10 / 5
except ZeroDivisionError:
    print("Division by zero is not allowed.")
else:
    print("No exception occurred.")



오류 회피하기:

어떤 이유로든 예외를 처리하지 않고 무시하려면 pass 문을 사용하여 오류를 회피할 수 있습니다.

try:
    result = 10 / 0
except ZeroDivisionError:
    pass



오류 일부러 발생시키기:

개발자가 직접 예외를 일으킬 수 있습니다. raise 문을 사용하여 예외를 발생시킵니다.

 

if x < 0:
    raise ValueError("x should be a positive number")


예외 만들기:

개발자는 자신만의 예외 클래스를 정의하여 사용할 수 있습니다. 이를 통해 특정 예외 상황을 처리할 수 있습니다.

class CustomError(Exception):
    def __init__(self, message):
        super().__init__(message)

try:
    raise CustomError("This is a custom exception.")
except CustomError as e:
    print(e)



이러한 예외 처리 기법을 사용하여 프로그램이 예외 상황에서도 안정적으로 동작하도록 할 수 있습니다.

 

 

예외처리 기능에서 오류를 일부러 발생시키는 경우가 있는 이유

예외를 일부러 발생시키는 기능은 개발자가 특정 상황에서 의도적으로 오류를 유발하여 예외처리를 테스트하거나 특정 조건을 시뮬레이션하기 위해 사용됩니다. 이러한 기능을 사용하는 주요 이유는 다음과 같습니다:

예외처리 테스트: 프로그램을 개발하고 디버깅하는 과정에서, 특정 예외 상황에 대한 예외처리 코드를 테스트해야 할 때가 있습니다. 하지만 실제 상황에서 그 예외를 발생시키기란 어려울 수 있습니다. 따라서 개발자가 일부러 예외를 발생시킴으로써 해당 예외에 대한 예외처리 코드가 올바르게 작동하는지 확인할 수 있습니다.

특정 조건 시뮬레이션: 어떤 상황에서 예외를 발생시켜 특정 동작을 시뮬레이션하고자 할 때도 있습니다. 예를 들어, 파일을 열 때 해당 파일이 없는 경우, 예외를 발생시켜 파일이 없을 때의 처리를 확인하거나 대안적인 동작을 정의할 수 있습니다.

오류 회피 방지: 프로그램이 특정 상태에 도달하면 오류를 발생시켜 일시적으로 프로그램의 실행을 중단시키는 경우도 있습니다. 이를 통해 더 큰 문제를 방지하거나 데이터 손실을 막을 수 있습니다.

디버깅 및 로그 기록: 예외를 발생시켜 오류 발생 위치와 원인에 대한 정보를 기록하면 디버깅을 더욱 쉽게 할 수 있습니다. 로깅 기능을 통해 발생한 예외와 관련된 정보를 기록하여 나중에 분석할 수 있습니다.

예외를 일부러 발생시키는 것은 주의가 필요하며, 실제로는 신중하게 사용되어야 합니다. 무분별하게 예외를 일으키면 프로그램이 예상치 못한 방식으로 동작하거나 디버깅이 어려워질 수 있습니다. 따라서 개발자는 예외를 명확하고 적절한 상황에서만 발생시키도록 주의해야 합니다.

 

모듈 만드는걸 잊어버린 경우 에러가 출력되도록 설정할 수 있습니다.

 

# 오류 일부러 발생시키기
class Bird :
    def fly(self) :
        raise NotImplementedError

class Eagle(Bird) :
    pass

# eagle = Eagle()
# eagle.fly() # 'NotImplementedError'

class Eagle(Bird) :
    def fly(self) :
        print('very fast')

eagle = Eagle()
eagle.fly() # 'very fast'

 

 

예외는 다음과 같이 파이썬 내장 클래스인 Exception 클래스를 상속하여 만들 수 있습니다.

그리고 별명을 출력하는 함수를 다음과 같이 작성해서 say_nick 함수를 호출합시다. 프로그램을 실행해 보면 다음과 같이 "천사"가 한 번 출력된 후 MyError가 발생합니다.

# error_make.py
class MyError(Exception):
    pass
    
def say_nick(nick):
    if nick == '바보':
        raise MyError()
    print(nick)


say_nick("천사")
say_nick("바보")

 

 

예외처리를 아래처럼 만들면 오류가 나면서 지정된 메세지가 나옵니다.

# error_make.py
class MyError(Exception):
    pass

try:
    say_nick("천사")
    say_nick("바보")
except MyError:
    print("허용되지 않는 별명입니다.")

 

만약 오류 메시지를 사용하고 싶다면 다음처럼 예외 처리를 하면 됩니다.

try:
    say_nick("천사")
    say_nick("바보")
except MyError as e:
    print(e)

 

 

아래코드를 예시로 사용하시죠

def divide_numbers():
    try:
        # 숫자 입력 받기
        num1 = float(input(": "))
        num2 = float(input(": "))
        
        # 숫자 나누기
        result = num1 / num2
        
        # 결과 출력
        print(f"{num1} / {num2} = {result}")
        
    except ValueError:
        print("올바른 숫자를 입력해주세요.")
        
    except ZeroDivisionError:
        print("0으로 나눌 수 없습니다.")
        
    except Exception as e:
        print(f"오류가 발생했습니다: {e}")
        
    else:
        print("나눗셈이 성공적으로 수행되었습니다.")
        
    finally:
        print("프로그램이 종료되었습니다.")

# divide_numbers 함수 호출
divide_numbers()

'파이썬 기초' 카테고리의 다른 글

파이썬 주의사항  (0) 2023.10.16
파이썬 내장함수 모음  (0) 2023.10.11
모듈  (0) 2023.10.11
클래스 설명  (0) 2023.10.11
파일 읽고쓰기  (0) 2023.10.11