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

无法捕获run命令读取二进制输出的Malformed UTF-8异常求解

解决Raku中读取二进制输出时的UTF-8异常问题

你遇到的核心问题是:run命令的:out参数默认以文本模式处理输出,当访问.out属性时,Raku会尝试将二进制数据解码为UTF-8字符串,这会触发Malformed UTF-8异常;而且这个异常是延迟触发的——不是在执行run时抛出,而是在首次访问.out时才抛出,所以只把run语句包在try里是捕获不到的。

最优解决方案:以二进制模式读取输出

直接告诉run命令以二进制模式处理标准输出,这样.out会返回二进制流,不会自动尝试UTF-8解码,从根源避免异常:

# 执行git show并以二进制模式获取输出
my $proc = run "git", "show", "<grabbed hash>:320px-Camelia.svg.png", :out(:bin);
# 读取二进制内容
my $binary-data = $proc.out.slurp(:bin);

# 后续可以对二进制数据做处理,比如写入文件
spurt "recovered.png", $binary-data, :bin;

如果需要捕获异常

如果必须处理文本模式下的解码异常,要确保将访问.out的操作也包含在try块内,并针对X::UTF8异常做处理:

try {
    my $proc = run "git", "show", "<grabbed hash>:320px-Camelia.svg.png", :out;
    say $proc.out; # 异常在这里触发
    CATCH {
        when X::UTF8 {
            say "无法将二进制数据解码为UTF-8:$_";
        }
        default {
            say "执行命令时出错:$_";
        }
    }
}

补充说明

  • :out(:bin)参数会让run的输出流保持二进制格式,适合处理图片、压缩包等非文本文件;
  • slurp(:bin)用于读取二进制流的全部内容,返回Blob类型,而非字符串;
  • 如果你只是想将git中的二进制文件导出到本地,其实可以直接用git show <hash>:<path> > output.png这样的系统重定向,不需要在Raku中处理二进制流,这也是更简单的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:37:08