异常处理
本文解释了在使用 Zivid Motion 时,如何在 Python 和 C++ 中正确处理异常。
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 辅助函数递归地解包嵌套异常,并以适当的缩进进行打印,从而展示导致故障的完整错误链。