반응형

목차

  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 키워드

try-except 구문

Python의 try-except 구문은 예외(런타임 오류)를 정상적으로 처리하는 데 사용됩니다. 오류가 발생했을 때 프로그램이 충돌하는 대신 try-except 블록을 사용하면 예외가 발생했을 때 일부 코드를 실행하고 프로그램 실행을 계속할 수 있습니다.

다음은 try-except 블록의 기본 구문입니다.

try:
    # Code that might raise an exception
except SomeExceptionType as e:
    # Code to handle the exception


이 예에서는 try 블록 내부의 코드가 실행됩니다. 실행 중에 지정된 유형의 예외(SomeExceptionType)가 발생하면 except 블록 내부의 코드가 실행됩니다. 발생한 예외 객체는 'as' 키워드 뒤에 변수 이름(이 경우 'e')을 사용하여 캡처할 수 있습니다. 그런 다음 이 변수를 사용하여 예외에 대한 자세한 정보를 얻거나 사용자 지정 오류 메시지를 표시할 수 있습니다. 

예외 유형을 튜플로 지정하여 단일 except 블록으로 여러 예외 유형을 잡을 수도 있습니다.

try:
    # Code that might raise an exception
except (ExceptionType1, ExceptionType2) as e:
    # Code to handle the exception


유형에 관계없이 예외를 포착하려면 Exception 기본 클래스를 사용할 수 있습니다.

try:
    # Code that might raise an exception
except Exception as e:
    # Code to handle the exception


그러나 일반적으로 모든 예외를 포착하는 것보다 발생할 것으로 예상되는 특정 예외 유형만 포착하는 것이 좋습니다. 이렇게 하면 예상하지 못한 의도하지 않은 마스킹 오류를 방지할 수 있습니다.

예외가 발생했는지 여부에 관계없이 실행될 코드를 포함하는 except 블록 뒤에 선택적 finally 블록을 추가할 수도 있습니다.

try:
    # Code that might raise an exception
except SomeExceptionType as e:
    # Code to handle the exception
finally:
    # Code that will always be executed


이는 try 블록 내 코드의 성공 또는 실패에 관계없이 파일 핸들 또는 네트워크 연결 닫기와 같은 리소스 정리에 유용할 수 있습니다.


try-except-else 구문

try, except 및 else 블록을 함께 사용하는 예를 살펴보겠습니다. 이 예에서는 사용자의 입력을 정수로 변환하고 숫자의 제곱을 계산하려고 합니다. 변환이 성공하면 결과를 출력하고 그렇지 않으면 예외를 처리하고 오류 메시지를 출력합니다.

def calculate_square():
    user_input = input("Enter a number: ")

    try:
        number = int(user_input)
    except ValueError:
        print("Invalid input. Please enter a valid integer.")
    else:
        square = number ** 2
        print(f"The square of {number} is {square}.")

calculate_square()


코드에 대한 내용은 다음과 같습니다.

  1. input() 함수를 사용하여 사용자로부터 입력을 받습니다.

  2. try 블록에서 int() 함수를 사용하여 사용자 입력을 정수로 변환하려고 시도합니다. 입력이 유효한 정수가 아니면 ValueError가 발생합니다.

  3. except 블록에서 ValueError 예외를 포착하고 잘못된 입력에 대해 사용자에게 알리는 오류 메시지를 인쇄합니다.
    변환에 성공하고 예외가 발생하지 않으면 else 블록이 실행됩니다. else 블록에서 정수의 제곱을 계산하고 결과를 인쇄합니다.

try, except 및 else 블록을 함께 사용하면 오류를 정상적으로 처리하고 예외가 발생하지 않을 때 특정 작업을 수행할 수 있습니다. 이는 보다 강력하고 유지 관리 가능한 코드로 이어집니다.


'finally' 문

Python의 'finally' 문은 예외가 발생했는지 여부에 관계없이 코드 블록이 항상 실행되도록 하기 위해 'try' 및 'except' 문과 함께 사용됩니다. finally 블록은 try, except 및 선택적 else 블록 뒤에 배치됩니다.

다음은 try-except-finally 구문의 일반 구문입니다.

try:
    # Code that might raise an exception
except SomeExceptionType as e:
    # Code to handle the exception
else:
    # Optional: Code to be executed if no exception is raised in the try block
finally:
    # Code that will always be executed, regardless of whether an exception was raised or not


'finally' 블록은 이전 코드에서 어떤 일이 발생하든 실행해야 하는 정리 작업을 수행하거나 리소스를 해제(예: 파일 핸들 닫기, 네트워크 연결 또는 데이터베이스 연결)해야 할 때 유용합니다.

다음은 finally 문 사용을 보여주는 예입니다.

file_handle = None

try:
    file_handle = open("file.txt", "r")
    content = file_handle.read()
    print(content)
except FileNotFoundError as e:
    print("File not found")
except IOError as e:
    print("An I/O error occurred")
finally:
    if file_handle:
        file_handle.close()
        print("File handle closed")


이 예제에서 'finally' 블록은 파일을 열거나 읽는 동안 예외가 발생하더라도 파일 핸들이 닫히도록 합니다. file_handle.close() 문은 try 및 except 블록에서 어떤 일이 발생하든 상관없이 실행됩니다.


try-except-else-finally 구문

Python에서 try-except-else 구문을 사용하면 try 블록에서 예외가 발생하지 않는 경우에만 실행될 코드 블록을 지정할 수 있습니다. else 블록은 try 블록 다음에 실행되지만 선택적 finally 블록(있는 경우) 이전에 실행됩니다. 구문은 다음과 같습니다.

try:
    # Code that might raise an exception
except SomeExceptionType as e:
    # Code to handle the exception
else:
    # Code to be executed if no exception is raised in the try block
finally:
    # Optional: Code that will always be executed, regardless of whether an exception was raised or not


try 블록 내부의 코드가 먼저 실행됩니다. 지정된 유형의 예외(SomeExceptionType)가 발생하면 except 블록 내부의 코드가 실행됩니다. try 블록에서 예외가 발생하지 않으면 else 블록 내부의 코드가 실행됩니다.

else 블록은 try 블록에서 예외가 발생하지 않은 경우에만 어떤 작업을 수행하려는 상황에서 유용할 수 있습니다. 예를 들어 이전 코드에 오류가 없는 경우에만 데이터베이스에 대한 변경 사항을 커밋할 수 있습니다.

다음은 try-except-else 구문의 사용을 보여주는 예입니다.

try:
    result = 10 / 2  # This might raise a ZeroDivisionError if the divisor is zero
except ZeroDivisionError as e:
    print("Cannot divide by zero")
else:
    print(f"The result of the division is {result}")
finally:
    print("This message will always be displayed, regardless of whether an exception was raised or not")


이 예에서 try 블록의 result 계산에서 ZeroDivisionError가 발생하지 않으면 else 블록이 실행되고 결과가 인쇄됩니다. 'finally' 블록이 있는 경우 예외가 발생했는지 여부에 관계없이 항상 실행됩니다.


closed 함수

파이썬에서 파일 객체의 closed 속성은 파일이 닫혀 있는지 여부를 확인하는 데 사용됩니다. 함수가 아니라 파일 객체의 속성입니다. 부울 값을 반환합니다. 파일이 닫혀 있으면 'True', 그렇지 않으면 'False'입니다.

다음은 closed 속성을 사용하는 방법의 예입니다.

# Opening a file for reading
file = open("example.txt", "r")

# Checking if the file is closed
if file.closed:
    print("The file is closed.")
else:
    print("The file is open.")

# Closing the file
file.close()

# Checking if the file is closed again
if file.closed:
    print("The file is closed.")
else:
    print("The file is open.")


이 예에서는 먼저 example.txt라는 파일을 읽기 위해 엽니다. 그런 다음 closed 속성을 사용하여 파일이 닫혀 있는지 열려 있는지 확인합니다. file.close()로 파일을 닫은 후 closed 속성을 다시 확인하여 파일이 실제로 닫혔는지 확인합니다.

작업을 마친 후에는 파일을 닫아 시스템 리소스를 확보하는 것이 중요합니다. 파일 닫기를 처리하는 권장 방법은 코드 블록이 종료될 때 파일을 자동으로 닫는 with 문을 사용하는 것입니다.

with open("example.txt", "r") as file:
    # Perform file operations here

# File is automatically closed after the block
if file.closed:
    print("The file is closed.")


이 예제에서는 with 블록이 종료되면 파일이 자동으로 닫히므로 파일 작업을 보다 안전하고 깔끔하게 수행할 수 있습니다.


return 키워드

반환 키워드는 코드의 다른 부분과 마찬가지로 try 문 안에 사용할 수 있습니다. try 블록 내에서 return을 사용하면 함수가 지정된 값을 즉시 반환하고 함수를 종료하여 try 블록의 나머지 코드와 연결된 예외, else 및 마지막으로 블록을 건너뜁니다.

다음은 try 문 내에서 return을 사용하는 예입니다.

def divide(a, b):
    try:
        result = a / b
        return result
    except ZeroDivisionError:
        print("Division by zero is not allowed.")
        return None

result1 = divide(10, 2)
result2 = divide(10, 0)
print(f"Result 1: {result1}")
print(f"Result 2: {result2}")


이 예에서는 두 개의 인수 a와 b를 사용하는 divide라는 함수를 정의합니다. a를 b로 나누려고 시도하고 나누기가 성공하면 즉시 결과를 반환합니다. ZeroDivisionError가 발생하면 except 블록 내부의 코드가 실행되고 함수는 None을 반환합니다.

예제의 출력은 다음과 같습니다.

Result 1: 5.0
Division by zero is not allowed.
Result 2: None


보시다시피 이 함수는 첫 번째 나눗셈에 대해 올바른 결과를 반환하고 두 번째 나눗셈에 대해 0으로 나누기 오류를 처리하여 'None'을 반환합니다.


반응형