You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WASM图像压缩项目调用oxipng时抛出RuntimeError: unreachable错误求助

问题排查与解决步骤

  • 第一步:修复代码中的 panic 风险
    你当前代码的res.unwrap()是最可能的报错来源:如果optimize_from_memory执行出错返回Err,unwrap会直接触发panic,WASM环境下未捕获的panic默认就会抛出RuntimeError: unreachable错误。且你日志仅输出到after options,说明错误就发生在optimize_from_memory执行过程中,还未走到后续的日志打印逻辑。
    请先修改函数签名和错误处理逻辑,将错误抛到JS层便于排查:
#[wasm_bindgen]
pub fn compress(data: &[u8]) -> Result<Vec<u8>, JsValue> {
    console_log!("{}", data.len());
    let opts = Options::from_preset(6);
    console_log!("after options");
    optimize_from_memory(data, &opts)
        .map_err(|e| JsError::new(&format!("oxipng 优化失败: {}", e)).into())
}

注意同时修正原代码里不必要的双重引用&&opts为&opts。

  • 第二步:添加panic钩子获取明确错误信息
    引入console_error_panic_hook依赖,将WASM的panic信息打印到浏览器控制台,避免无意义的unreachable报错:
  1. 在Cargo.toml中添加依赖:
[dependencies]
console_error_panic_hook = "0.1.7"
  1. 在lib.rs中添加初始化钩子:
#[wasm_bindgen(start)]
pub fn init() {
    console_error_panic_hook::set_once();
}

在前端调用compress之前先调用这个init函数,后续panic会直接输出完整错误栈和原因。

  • 第三步:验证Rust版本兼容性
    oxipng 2.2.2发布于2019年,适配的Rust版本区间为1.34~1.45,你当前使用的Rust 1.55确实存在版本不兼容的可能,可切换旧版本工具链重试:
# 安装对应版本工具链
rustup install 1.45.0
# 在当前项目目录设置默认工具链
rustup override set 1.45.0
# 重新构建
wasm-pack build --target web
  • 第四步:验证输入数据合法性
    你可以将Flutter Web传入的Uint8List先导出为本地PNG文件,用桌面版的oxipng 2.2.2测试能否正常压缩,排除输入的PNG文件损坏、格式不兼容的问题。

内容的提问来源于stack exchange,提问作者Vanethos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:36:03