Arrow C++ API 遵循一些简单的规则。与许多规则一样,可能会有例外情况。
语言版本
从版本10.0开始,Arrow C++兼容C++17。
命名空间
Arrow的所有API(除了宏)都在arrow命名空间内,以及其中嵌套的命名空间。
安全指针
Arrow对象通常使用安全指针进行传递和存储 - 大多数情况下是std::shared_ptr,但有时也是std::unique_ptr。
不可变性
许多Arrow对象都是不可变的:一旦构造完成,它们的逻辑属性将不再更改。这使得可以在多线程场景中使用它们,而不需要繁琐和容易出错的同步。
当然,也有明显的例外,比如IO对象或可变数据缓冲区。
错误报告
大多数API通过返回arrow::Status实例来指示成功或错误的结果。Arrow不会抛出自己的异常,但第三方异常可能会传播,尤其是std::bad_alloc(但Arrow不使用标准分配器来分配大数据)。
当API可以返回错误代码或成功值时,通常通过返回模板类arrow::Result来实现。但是,一些API(通常已被弃用)返回arrow::Status并将结果值作为输出指针参数传递。
以下是检查操作结果的示例:
const int64_t buffer_size = 4096; auto maybe_buffer = arrow::AllocateBuffer(buffer_size, &buffer); if (!maybe_buffer.ok()) { // ... 处理错误 } else { std::shared_ptr<arrow::Buffer> buffer = *maybe_buffer; // ... 使用分配的缓冲区 }
如果调用者函数本身返回arrow::Result或arrow::Status,并希望传播任何不成功的结果,可以使用两个方便的宏:
ARROW_RETURN_NOT_OK接受一个arrow::Status参数,如果不成功则返回该参数。
ARROW_ASSIGN_OR_RAISE接受一个arrow::Result参数,如果成功,将其结果分配给左值,或在出现错误时返回相应的arrow::Status。
例如:
arrow::Status DoSomething() { const int64_t buffer_size = 4096; std::shared_ptr<arrow::Buffer> buffer; ARROW_ASSIGN_OR_RAISE(buffer, arrow::AllocateBuffer(buffer_size)); // ... 分配成功,下面处理buffer // 最后返回成功 return Status::OK(); }