lance-format/lance

Add `ReadFileError` and `DecodeColumnError` wrappers to provide better context for decoding errors

Open

#5,602 建立於 2025年12月31日

在 GitHub 查看
 (1 留言) (0 反應) (0 負責人)Rust (695 fork)github user discovery
good first issue

倉庫指標

Star
 (6,582 star)
PR 合併指標
 (平均合併 6天 1小時) (30 天內合併 219 個 PR)

描述

Currently, errors that happen when decoding a column are missing information about:

  1. What column that is
  2. What file we are reading

This context is available higher up in the call stack that the main error is generate. We can add additional context by adding wrapper errors.

This approach is described nicely in https://sabrinajewson.org/blog/errors.

Basically, want to do things like:

enum DecodeError {
    NumberOutOfRange,
    ...
}

struct DecodeFieldError {
    field_name: String,
    field_id: i32,
    offset: u64,
    source: DecodeError,
}

fn decode(field: Field, data: Bytes) -> Result<_, DecodeFieldError> {
    ...
}

enum ReadFileErrorKind {
    IO(ObjectStoreError),
    Decode(DecodeFieldError),
}

struct ReadFileError {
    path: Path,
    kind: ReadFileErrorKind,
}

fn read_file(path: Path) -> Result<_, ReadFileError> {
    let data = read_data(path)?;
    for field in data.schema() {
        decode(field, data).map_err(|err: DecodeFieldError| {
            ReadFileError { path, kind: ReadFileErrorKind::Decode(err) }
        });
    }
}

And then the error stack would look like:

Error: failed to read file 'data.lance'

Caused by:
    0: failed to read field 'age' (id: 10) for row offset 10
    1: number out of range

貢獻者指南