예외 처리
이 문서에서는 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 헬퍼 함수를 사용해 중첩된 예외를 재귀적으로 추적하여 적절한 들여쓰기로 출력하므로, 실패에 이르게 된 전체 오류(예외) 체인을 확인할 수 있습니다.