예외 처리

이 문서에서는 Python과 C++ 환경에서 Zivid Motion을 사용할 때 예외를 올바르게 처리하는 방법을 설명합니다.

Python 예외 처리

Python에서 Zivid Motion 라이브러리의 예외는 언어 런타임에 의해 자동으로 처리됩니다. 중첩된 예외는 적절하게 풀려나며, 표준 Python 예외 처리를 사용하여 이를 포착할 수 있습니다.

# ...

try:
    result = planner.path(...)

except Exception as e:
    print(f"An error occurred: {e}")

Python은 트레이스백에서 중첩된 예외를 자동으로 처리하므로 전체 예외 체인을 확인하기 위해 특별히 할 일이 없습니다.

C++ 예외 처리

C++에서는 예외가 중첩되어 오류 발생 원인에 대한 더 자세한 정보를 제공할 수 있습니다. Zivid Motion은 중첩 예외를 사용하여 관련 오류를 연결합니다. 이러한 예외를 제대로 처리하려면 중첩된 예외 체인을 명시적으로 풀어야 합니다.

Zivid SDK가 설치된 경우

Zivid SDK에 접근할 수 있다면 중첩 예외를 자동으로 처리해주는 Zivid::toString(const std::exception&) 함수를 사용할 수 있습니다.

#include <Zivid/Exception.h>
#include <Zivid/Motion/Planner.h>

#include <iostream>

int main()
{
    // ...

    try
    {
        auto result = planner.path(...);
    }
    catch(const std::exception &e)
    {
        std::cerr << "Error: " << Zivid::toString(e) << std::endl;
    }
}

Zivid::toString() 함수는 예외 메시지와 중첩된 예외를 모두 문자열로 변환하여 오류 발생의 전체적인 맥락을 쉽게 이해할 수 있도록 합니다.

Zivid SDK가 설치되지 않은 경우

Zivid SDK에 접근할 수 없는 경우(예: 독립 실행형 Zivid Motion 애플리케이션)에는 중첩 예외를 수동으로 처리해야 합니다.

#include <Zivid/Motion/Planner.h>

#include <iostream>
#include <exception>

void printException(const std::exception &e, const int level = 0)
{
    std::cerr << std::string(level * 4, ' ') << (level ? "+ " : "") << "Exception: " << e.what() << '\n';
    try
    {
        std::rethrow_if_nested(e);
    }
    catch(const std::exception &nestedException)
    {
        printException(nestedException, level + 1);
    }
    catch(...)
    {}
}

int main()
{
    // ...

    try
    {
        auto result = planner.path(...);
    }
    catch(const std::exception &exception)
    {
        printException(exception);
    }
}

이 방식은 printException 헬퍼 함수를 사용해 중첩된 예외를 재귀적으로 추적하여 적절한 들여쓰기로 출력하므로, 실패에 이르게 된 전체 오류(예외) 체인을 확인할 수 있습니다.