ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Xberg Dart 绑定中 extract_batch 对缺失 URI 输入的错误处理:从 e2e 用例到引擎实现

Xberg Dart 绑定中 extract_batch 对缺失 URI 输入的错误处理:从 e2e 用例到引擎实现 后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载导读本文聚焦 Xberg 批量提取 APIextract_batch中一个极易踩坑却十分重要的边界场景当批量输入的 URI 指向不存在的文件not found时调用不会整体失败抛出异常而是把该输入计入summary.errors成功项仍正常进入summary.results。通过逐行解析 Dart 绑定代码、fixture 断言与 Rust 引擎/CLI 层的实现你将掌握如何在 Xberg 的 15 种语言绑定中可靠地编写部分失败、逐项归因的批量提取逻辑。场景背景批量提取与 URI 输入Xberg 的批量提取 API 接受一组ExtractInput每个输入按kind分为两种bytes内联的原始字节 mime_typeuri指向本地文件或远程文档的地址由引擎负责读取/下载。与单文档提取不同批量接口的契约是逐项隔离某个输入失败文件不存在、下载失败、格式不可解析不会中断整批任务失败信息被收集进summary.errors成功结果进入summary.results。本文要分析的用例正是这一契约的典型验证输入一个uri指向不存在的/nonexistent/a.pdf。Dart 绑定代码逐行详解关联文档 docs-site/src/snippets-generated/dart/batch/extract_batch_uri_not_found.md 给出的完整 Dart 代码如下import dart:convert; import dart:io; import package:xberg/xberg.dart; import package:xberg/src/xberg_bridge_generated/frb_generated.dart show RustLib; Futurevoid main() async { await RustLib.init(); try { final inputs await Future.wait((jsonDecode(r[{kind:uri,uri:/nonexistent/a.pdf}]) as Listdynamic).map((element) createExtractInputFromJson(json: jsonEncode(element)))); final result await XbergBridge.extractBatch(inputs); stdout.writeln(result.summary.results); stdout.writeln(result.summary.errors); } finally { RustLib.dispose(); } }逐段拆解其关键点初始化 FFI 桥RustLib.init()加载通过 flutter_rust_bridgefrb生成的 FFI 绑定层见 packages/dart/lib/src/xberg_bridge_generated/lib.dart这是所有 Dart 侧调用 Rust 核心的前提main结束前在finally中调用RustLib.dispose()释放资源。从 JSON 构造输入使用createExtractInputFromJson把 JSON 描述映射为 Dart 侧的ExtractInput对象。这里kind: uri、uri: /nonexistent/a.pdf表明目标是本地绝对路径Future.wait用于并发地把一个 JSON 数组批量转换为输入列表。调用批量提取XbergBridge.extractBatch(inputs)返回结果对象其中result.summary.results是成功数、result.summary.errors是失败数。本例的预期输出是0与1——调用本身不抛异常而是以 summary 计数形式暴露失败。诊断输出stdout.writeln直接打印两个计数便于断言与日志采集。fixture 断言可验证的行为契约该用例的正确行为并非只存在于文档而是被固化为可机器验证的断言。查看 fixtures/batch/extract_batch_uri_not_found.json{ id: extract_batch_uri_not_found, category: batch, call: extract_batch, input: { inputs: [{kind: uri, uri: /nonexistent/a.pdf}] }, assertions: [ {type: not_error}, {type: equals, field: summary.results, value: 0}, {type: equals, field: summary.errors, value: 1} ] }三个断言共同定义了该场景的语义边界not_error顶层调用不得抛出异常——URI 不存在属于预期内、可归因的业务失败而非系统级错误summary.results 0没有任何成功文档summary.errors 1恰好一个输入被记为失败。同目录下的 extract_batch_uri_partial_failure.json一个有效 URI 一个下载后不可解析的 URI断言results 1、errors 1与 empty_inputs.json空批量results 0共同勾勒出批量接口逐项独立成败的完整行为矩阵。e2e 测试验证同一语义在 Dart e2e 测试中被重复验证见 e2e/dart/test/batch_test.darttest(extract_batch with missing URI input, () async { final inputs await Future.wait( (jsonDecode(r[{kind:uri,uri:/nonexistent/a.pdf}]) as Listdynamic) .map((element) createExtractInputFromJson(json: jsonEncode(element))), ); final result await XbergBridge.extractBatch(inputs); expect(result.summary.results, equals(0)); expect(result.summary.errors, equals(1)); });该文件同批次还覆盖了extract_batch with missing URI inputsL202-L215两个不存在的 URI断言results 0、errors 2证明错误数按输入逐项累计extract_batch: empty batchL192-L200空输入数组返回空结果extract_batch with one valid URI input and one that downloads to an unparseable documentL244-L262混合成功与失败的批量验证部分失败语义extract_batch: happy path with mixed inputsL136-L148正常路径基线。测试基础设施在setUpAll中通过CRAWLBERG_ALLOW_PRIVATE_NETWORKtrue、RUST_MIN_STACK等环境变量配置运行时见同文件 L72-L120并使用 mock server 提供 fixture 的 URL 映射保证 e2e 断言稳定可复现。底层实现错误如何被收集而非抛出引擎 API 层批量提取的入口在 crates/xberg/src/api/handlers.rs对 HTTP/API 请求的处理器直接调用 Rust 核心的crate::extract_batch(inputs, config)。该函数返回的结构中results成功文档与errors逐项失败并存这正是 summary 计数的数据来源。CLI 层的错误处理与诊断格式CLI 批量命令的实现位于 crates/xberg-cli/src/commands/extract/batch.rs。值得关注的是它对批量错误的渲染与退出策略分离设计fn write_batch_errorsW: Write(errors: [ExtractionErrorItem], out: mut W) - std::io::Result() { for error in errors { writeln!(out, error [input {}: {:?}]: {:?}, error.index, error.source, error.message)?; } Ok(()) } fn fail_batch_errors(errors: [ExtractionErrorItem]) - Result() { if errors.is_empty() { return Ok(()); } anyhow::bail!(Batch extraction completed with {} error(s)., errors.len()) }要点每个失败项输出到stderr格式为error [input index: source]: messageindex是输入在批量数组中的位置source保留原始来源如 URI 路径因此可以精确定位是哪一项失败错误诊断写完后若存在任何失败项命令以非零状态退出并汇总错误总数成功项的内容仍正常输出。这印证了批量不抛异常、逐项归因在 CLI 面的完整闭环。同文件中的batch_per_file_timingsL122-L167还会基于每个结果元数据中的source_index与extraction_duration_ms生成逐文件耗时失败的输入在 timings 中对应None——从源码结构看这为批量的性能归因与失败项识别提供了另一条线索。错误类型体系批量内收集的每一项失败最终归属于 Xberg 的统一错误体系定义在 crates/xberg/src/error.rsXbergError::Io文件系统/IO 错误错误码 1000正是URI 指向的文件不存在这类场景的典型归属且注释明确要求 IO 类错误必须原样上浮便于问题追踪。错误码通过alef(error_code N)固化后跨 FFI 边界进入各语言绑定成为绑定侧区分错误类别的稳定契约。实战建议正确编写不存在的 URI 批量任务综合以上实现在 XbergDart 或其他绑定中处理 URI 可能不存在的批量提取应遵循以下模式不要把文件不存在当成异常批量 API 的契约是逐项隔离顶层调用not_error失败体现在summary.errors计数与逐项错误明细中用 summary 驱动主流程summary.results驱动成功文档消费summary.errors驱动告警与重试需要逐项明细时遍历结果结构中的 errors含index、source、messageCLI 场景注意退出码xberg extract --batch在存在任何失败项时仍会输出成功内容但最终以非零状态退出并附带error [input index: source]: message诊断自动化脚本应据此区分全部成功与部分失败利用既有测试矩阵回归仓库的 fixtures/batch 目录与 e2e/dart/test/batch_test.dart 已覆盖 empty、missing URI、部分失败、混合输入等完整场景可作为各绑定实现的对照基准。小结URI 不存在在 Xberg 批量提取中被设计为可预测、可计数、可逐项归因的业务失败Dart 绑定通过summary.results/summary.errors呈现计数fixture 用not_error 计数断言固化契约e2e 测试在 e2e/dart/test/batch_test.dart 中重复验证而 Rust 引擎与 crates/xberg-cli/src/commands/extract/batch.rs 在底层保证了失败项与成功项的分离处理。理解这条链路是写出健壮批量提取逻辑尤其是面向海量本地文件或远程 URL 的批处理流水线的基础。赞分享后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载相关推荐Xberg Dart 批量提取容错实战extract_batch 处理全部缺失 URI 输入Xberg Dart 批量提取容错实战extract_batch 处理全部缺失 URI 输入 导读 当一批待提取的文档 URI 全部指向不存在的文件如路径拼后端AI 应用NLPXberg C 绑定批量提取容错指南用 extract_batch 处理全部 URI 缺失的场景Xberg C 绑定批量提取容错指南用 extract_batch 处理全部 URI 缺失的场景 批量文档提取 extract_batch 是 Xberg后端AI 应用NLPXberg Elixir 批量提取部分失败处理实战extract_batch 的 URI 输入、summary 统计与逐项错误定位Xberg Elixir 批量提取部分失败处理实战extract_batch 的 URI 输入、summary 统计与逐项错误定位 本篇技术指南以 Xberg后端AI 应用NLP上一篇告别手绘神经网络PlotNeuralNet让模型结构图一键生成下一篇Nginx Proxy Manager跨域Cookie共享CORS与SameSite属性配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表