无法捕获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
相关产品推荐
相关产品推荐

