PyO3를 활용한 파이썬 모듈의 예외 처리 방법

PyO3는 C와 파이썬을 연결하는 기능을 제공하는 파이썬 확장 모듈 개발 도구입니다. 이를 통해 C나 C++로 작성된 라이브러리를 파이썬에서 직접 사용할 수 있습니다. 하지만 파이썬 모듈을 개발할 때 예외 처리 방법을 올바르게 구현하는 것은 중요합니다. 이번 글에서는 PyO3를 활용한 파이썬 모듈에서 예외 처리를 하는 방법에 대해 알아보겠습니다.

1. try-except 구문 활용

PyO3를 사용하여 파이썬 모듈을 개발할 때, C나 C++ 라이브러리에서 발생하는 예외를 처리하기 위해 try-except 구문을 활용할 수 있습니다. 예를 들어, C 라이브러리에서 발생하는 예외를 파이썬 모듈에서 처리하려면 다음과 같은 코드를 사용할 수 있습니다.

#[macro_use]
extern crate pyo3;

use pyo3::exceptions;

#[pyfunction]
fn divide_numbers(a: i32, b: i32) -> PyResult<i32> {
    if b == 0 {
        let err = exceptions::ZeroDivisionError::py_err("Division by zero");
        return Err(err);
    }
    Ok(a / b)
}

위의 예제에서는 divide_numbers라는 C 함수를 파이썬 모듈에 노출시키고 있습니다. 만약 b가 0일 경우, ZeroDivisionError 예외를 발생시키고 있습니다. 이 예외는 exceptions 모듈에서 제공하는 예외 클래스를 사용하여 생성됩니다. 이제 파이썬에서 해당 모듈을 사용할 때 try-except 구문을 이용하여 예외를 처리할 수 있습니다.

import my_module

try:
    result = my_module.divide_numbers(10, 0)
    print(result)
except ZeroDivisionError as e:
    print(e)

위의 파이썬 코드에서 divide_numbers 함수를 사용할 때, ZeroDivisionError 예외가 발생할 수 있습니다. 이를 try-except 구문을 통해 처리하여 예외를 잡을 수 있습니다.

2. PyErr_SetString 함수 활용

또 다른 방법으로, C 함수 내부에서 직접 예외를 발생시킬 수 있습니다. 이를 위해 PyErr_SetString 함수를 사용하면 됩니다. 다음은 PyErr_SetString 함수를 사용하여 예외를 발생시키는 예제입니다.

use pyo3::ffi::PyObject;
use pyo3::types::IntoPyDict;

#[pyfunction]
fn divide_numbers(a: i32, b: i32) -> PyResult<i32> {
    if b == 0 {
        unsafe {
            let py = Python::acquire_gil().python();
            let err = PyErr_SetString(
                PyExc_ZeroDivisionError,
                "Division by zero\0".as_ptr() as *const c_char,
            );
            return Err(PyErr::fetch(py).into());
        }
    }
    Ok(a / b)
}

위의 예제에서는 C 함수 내부에서 PyErr_SetString 함수를 사용하여 ZeroDivisionError 예외를 발생시키고 있습니다. 이를 파이썬 모듈에서 사용할 때 try-except 구문을 통해 예외를 처리할 수 있습니다.

import my_module

try:
    result = my_module.divide_numbers(10, 0)
    print(result)
except ZeroDivisionError as e:
    print(e)

위의 예제에서는 divide_numbers 함수를 사용할 때, ZeroDivisionError 예외가 발생할 수 있습니다. 이를 try-except 구문을 통해 처리하여 예외를 잡을 수 있습니다.

결론

PyO3를 활용하여 파이썬 모듈을 개발할 때, 예외 처리 방법을 올바르게 구현하는 것은 중요합니다. 위에서 소개한 두 가지 try-except 구문 활용과 PyErr_SetString 함수 활용을 통해 C나 C++ 라이브러리에서 발생하는 예외를 파이썬에서 적절히 처리할 수 있습니다. 예외 처리를 통해 모듈의 안정성을 높이고 사용자에게 친숙한 예외 정보를 제공할 수 있습니다.