异常处理

本文解释了在使用 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 辅助函数递归地解包嵌套异常,并以适当的缩进进行打印,从而展示导致故障的完整错误链。