Return 包含未加引号的字符串的结果

Return Result with unquoted string

如果我有这样的文件:

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)
)?

但这只会让事情变得更糟:

Error: "\"May\nJune\""

您必须自己打印错误,而不是依赖默认的回退实现。

main() -> Result<…> 打印错误的 Debug 版本(字符串被转义)。它旨在作为示例或围栏的快速'n'dirty 解决方案,而不是用于任何人都会关心输出表示的真实程序。

使用:

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

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

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

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

还有一个替代解决方案,即在错误上实现自定义 Debug 实现,使 Debug 实现打印出 non-debug 一个,但恕我直言,这是一种 hack,需要更多代码而不仅仅是简单的打印。如果你想要那个 hack,看看 the anyhow crate

为此引入额外的依赖项可能有点矫枉过正,但您可以使用 terminator 包,它提供了一种新的错误类型,旨在从 main 返回,委托给Display 使用 Debug 打印时的实现。那么您的示例将如下所示...

use terminator::Terminator;

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

...输出将是这样的:

Error: May
June