반응형

목차

  1. 오류의 종류
    1. 파이썬 오류의 종류
    2. 런타임 오류 vs 예외 오류
    3. 예외 오류 처리 하는 방법
    4. 조건문을 사용한 예외 처리(Exception handling)
    5. "허가보다 용서를 구하는 것이 더 쉽다(It's easier to ask for forgiveness than permission)"
  2. 오류 해결을 위한 구문
    1. try-except 구문
    2. try-except-else 구문
    3. 'finally' 구문
    4. try-except-else-finally 구문
    5. closed 함수
    6. return 키워드

파이썬 오류의 종류

Python에는 코드 작업 중에 발생할 수 있는 몇 가지 유형의 오류가 있습니다. 이러한 오류는 크게 구문 오류와 예외의 두 가지 유형으로 분류할 수 있습니다.

1. 구문 오류
이러한 오류는 Python 파서가 코드에서 잘못된 구문을 발견할 때 발생합니다. 구문 오류에는 누락되거나 잘못된 구두점, 잘못된 들여쓰기 또는 잘못된 구문 구문 사용이 포함될 수 있습니다. 구문 오류의 예는 다음과 같습니다.

  • 누락되거나 잘못 배치된 콜론, 괄호 또는 쉼표
  • 코드 블록을 정의하기 위해 들여쓰기를 사용하기 때문에 Python에서 중요한 잘못된 들여쓰기
if 5 > 2  # Syntax error: Missing colon at the end of the line
    print("5 is greater than 2")

 


2. 예외
예외는 코드 실행 중에 발생하는 오류입니다. 이러한 오류는 일반적으로 잘못된 논리, 내장 함수의 잘못된 사용 또는 예기치 않은 입력으로 인해 발생합니다. 몇 가지 일반적인 예외는 다음과 같습니다.

  • NameError: 현재 범위에 정의되지 않은 변수나 함수를 사용하려고 할 때 발생
  • TypeError: 특정 작업이나 기능에 잘못된 유형을 사용할 때 발생
  • ValueError: 특정 작업이나 기능에 잘못된 값을 제공했을 때 발생
  • IndexError: 목록 또는 다른 시퀀스 유형의 범위를 벗어난 인덱스에 액세스하려고 할 때 발생합니다.
  • KeyError: 사전에 존재하지 않는 키에 접근하려 할 때 발생
  • ZeroDivisionError: 숫자를 0으로 나누려고 할 때 발생
undefined_variable = 5 + nonexistent  # NameError

result = "Hello" + 5  # TypeError

number = int("text")  # ValueError

my_list = [1, 2, 3]
element = my_list[5]  # IndexError

my_dict = {"key1": "value1"}
value = my_dict["key2"]  # KeyError

division = 5 / 0  # ZeroDivisionError


예기치 않은 오류로 인해 프로그램이 중단되지 않도록 하려면 try-except 블록을 사용하여 코드의 예외를 처리하는 것이 중요합니다.


런타임 오류 vs 예외 오류

런타임 오류 및 예외 오류는 종종 같은 의미로 사용되는 용어입니다. 그러나 그들 사이에는 미묘한 차이가 있습니다.

  1. 런타임 오류
    런타임 오류는 프로그램 실행 중에 발생하는 모든 오류를 가리키는 일반적인 용어입니다. 여기에는 논리적 오류, 입/출력 오류, 프로그램에서 발생한 예외 등 프로그램이 실행되는 동안 발생할 수 있는 모든 유형의 오류가 포함됩니다. 런타임 오류는 언어 구성 또는 코드 구문과 반드시 ​​관련이 있는 것은 아닙니다. 잘못된 알고리즘, 시스템 리소스 부족 또는 하드웨어 문제와 같은 다양한 이유로 인해 발생할 수 있습니다. 런타임 오류가 있는 프로그램은 비정상적으로 종료되거나 잘못된 결과를 생성할 수 있습니다.

  2. 예외 오류
    반면에 예외 오류는 프로그램이 0으로 나누기, 범위를 벗어난 인덱스에 액세스, 또는 존재하지 않는 파일을 열려고 시도합니다. Python을 비롯한 많은 프로그래밍 언어에서 프로그램이 자체적으로 처리할 수 없는 오류 조건을 만나면 예외가 발생합니다. 프로그래머는 프로그램 충돌을 방지하고 오류를 적절하게 처리하기 위해 try-except 블록과 같은 예외 처리 메커니즘을 사용하여 이러한 예외를 처리할 수 있습니다.

요약하면 런타임 오류는 프로그램 실행 중에 발생할 수 있는 광범위한 오류 범주인 반면 예외 오류는 프로그램이 자체적으로 처리할 수 없는 예외 조건을 만났을 때 발생하는 특정 유형의 런타임 오류입니다. 예외 오류는 프로그래밍 언어에서 제공하는 예외 처리 메커니즘을 사용하여 포착하고 처리할 수 있는 반면 런타임 오류는 프로그램 논리 또는 기본 시스템에서 추가 디버깅 및 수정이 필요할 수 있습니다.


예외 오류 처리 하는 방법

예외 처리(Exception handling)는 프로그램 실행 중에 오류를 정상적으로 처리하는 방법입니다. Python에서는 예외 처리를 위해 try, except, finally 및 raise 문을 사용할 수 있습니다.

다음은 Python에서 예외 처리를 사용하는 방법입니다.

  • try 블록
    try 블록 내에서 예외를 발생시킬 수 있는 코드를 포함합니다. 예외가 발생하면 코드 실행이 적절한 except 블록으로 이동합니다.

  • except 블록
    하나 이상의 except 블록을 사용하여 특정 예외를 포착하고 처리합니다. 튜플로 지정하여 동일한 블록에서 여러 예외를 catch하거나 다른 예외에 대해 별도의 except 블록을 사용할 수 있습니다.

  • else 블록(선택 사항)
    모든 except 블록 다음에 else 블록을 사용할 수 있습니다. else 블록의 코드는 try 블록이 예외를 발생시키지 않으면 실행됩니다.

  • finally 블록(선택 사항)
    finally 블록은 예외가 발생했는지 여부에 상관없이 실행되어야 하는 코드를 지정하는 데 사용됩니다. 이 블록은 선택 사항이며 try, except 및 else 블록 뒤에 나타날 수 있습니다.

  • raise 문
    raise 문을 사용하여 코드 내에서 명시적으로 예외를 발생시킬 수 있습니다. 이는 사용자 지정 예외를 발생시키거나 예외를 처리한 후 다시 발생시키려는 경우에 유용합니다.


다음은 Python에서 예외 처리를 사용하는 예입니다.

try:
    # Code that might raise an exception
    x = int(input("Enter a number: "))
    result = 10 / x
except ZeroDivisionError:
    # Handle the ZeroDivisionError exception
    print("Error: Division by zero.")
except ValueError:
    # Handle the ValueError exception (e.g., non-numeric input)
    print("Error: Invalid input. Please enter a number.")
else:
    # This block executes if no exception occurred
    print(f"The result is: {result}")
finally:
    # This block executes no matter what
    print("This message is always displayed.")


이 예에서 try 블록 내의 코드는 ZeroDivisionError 또는 ValueError 예외를 발생시킬 수 있습니다. except 블록은 이러한 예외를 처리하고 final 블록은 예외 발생 여부에 관계없이 특정 메시지가 항상 표시되도록 합니다.


조건문을 사용한 예외 처리(Exception handling)

조건문을 사용한 예외 처리는 "허가보다 용서를 구하는 것이 더 쉽다(it's easier to ask for forgiveness than permission)"는 파이썬의 접근 방식에 어긋나므로 권장되지 않습니다. 대신 예외 처리를 위해 try 및 except 블록을 사용하는 것이 좋습니다.

그러나 여전히 조건문을 사용하여 예외를 처리하려는 경우에는 예외를 발생시킬 수 있는 코드를 실행하기 전에 예외를 발생시킬 수 있는 조건을 확인할 수 있습니다. 이 접근 방식을 "도약하기 전에 살펴보기(LBYL)"라고 합니다.

그러나 여전히 조건문을 사용하여 예외를 처리하려는 경우 예외를 발생시킬 수 있는 코드를 실행하기 전에 예외를 유발할 수 있는 조건을 확인할 수 있습니다. 이 접근법은 "도약하기 전에 보기"(Look Before You Leap, LBYL)로 알려져 있습니다.

다음은 조건문을 사용하여 예외를 처리하는 예입니다.

x = input("Enter a number: ")

# Check if the input is a valid number
if x.isdigit():
    x = int(x)

    # Check for division by zero
    if x != 0:
        result = 10 / x
        print(f"The result is: {result}")
    else:
        print("Error: Division by zero.")
else:
    print("Error: Invalid input. Please enter a number.")


이 예제에서는 'if' 문을 사용하여 나누기를 수행하기 전에 입력이 유효한 숫자인지, 0이 아닌지 확인합니다. 이 접근 방식은 사전에 조건을 확인하여 예외 발생을 방지합니다.

예외 처리에 조건문을 사용하면 정상적인 코드 흐름과 오류 처리 코드가 분리되지 않으므로 코드의 가독성과 유지 관리가 어려워질 수 있습니다. 또한 발생할 수 있는 모든 가능한 예외를 포착하지 못하여 코드의 견고성이 떨어질 수 있습니다. 따라서 일반적으로 Python에서 예외 처리를 위해 try 및 except 블록을 사용하는 것이 좋습니다.


"허가보다 용서를 구하는 것이 더 쉽다(It's easier to ask for forgiveness than permission)"

"허락을 구하는 것보다 용서를 구하는 것이 더 쉽다"는 미국의 컴퓨터 과학자이자 미 해군 후방 제독인 그레이스 호퍼의 명언이 유명합니다. 이 속담은 어떤 상황에서는 행동하기 전에 허가를 기다리는 것보다 먼저 승인을 구하지 않고 행동을 취한 다음 나중에 결과나 이의를 처리하는 것이 더 낫다는 것을 시사합니다.

이 문구는 허가나 승인을 기다리는 것이 진행을 방해하고 창의성을 억제할 수 있는 혁신과 위험 감수라는 맥락에서 자주 사용됩니다. 경우에 따라서는 명시적인 허가가 없더라도 자신의 행동이 긍정적인 결과를 가져올 것이라고 믿는 상황에서 적극적이고 주도적인 태도를 취하도록 장려하기도 합니다.

프로그래밍 세계에서는 이 말을 EAFP(허락보다 용서를 구하는 것이 더 쉽다)라는 철학으로 채택했습니다. EAFP는 코드를 실행하기 전에 가능한 오류를 확인하는 대신 예외를 처리하기 위해 시도 예외 블록을 사용하는 것을 선호하는 코딩 스타일입니다. 이 접근 방식은 오류나 예외 조건을 확인하기 위한 긴 if-else 체인을 피할 수 있으므로 경우에 따라 더 깔끔하고 가독성 높은 코드를 만들 수 있습니다.


반응형