返回结果,带无引号的字符串

问题描述

如果我有这样的文件

[[1,2,3],[-4,-5,-6],[7,8],[-9],[10],[-11],[12]]

我得到这个结果:

use std::error::Error;
fn main() -> Result<(),Box<dyn Error>> {   

   Err("May
June")?

}

是否可以在输出获取未加引号的字符串?像这样:

Error: "May\nJune"

我尝试过:

Error: May
June

但这只会使情况变得更糟:

Err("May
June").map_err(|e|
   format!("{:?}",e)
)?

解决方法

您必须自己打印错误,而不要依赖默认的后备实现。

main() -> Result<…>显示错误的Debug版本(其中转义了字符串)。它旨在作为示例或游戏围栏的快速解决方案,而不是用于任何人都在乎输出表示的真实程序。

使用:

fn main() {
   if let Err(e) = run() {
       eprintln!("{}",e);
       std::process::exit(1);
   }
}

fn run() -> Result<(),Box<dyn Error>> {
   // etc
}

它将使用Display格式打印错误。

main()的内置错误处理没有什么特别的,因此您自己打印错误不会丢失任何东西。

还有另一种解决方案,可对错误实施自定义Debug实现,以使Debug实现打印为非调试代码,但是恕我直言,这是一个hack,并且不仅需要这样做,还需要更多代码简单明了的打印。如果您想破解,请查看the anyhow crate

,

为此添加额外的依赖关系可能会过大,但是您可以使用terminator条板箱,该条板箱提供了一种新的错误类型,该错误类型将从main返回,并委托给{{ 1}}实现(通过Display打印)。然后您的示例将如下所示……

Debug

...,输出将是这样:

use terminator::Terminator;

fn main() -> Result<(),Terminator> {   
   Err("May
June")?
}