我想有一个main函数,可以失败,返回Err(String)和打印它的情况下失败。我是这样试的:
main
Err(String)
fn main() -> Result<(), String> { Err(String::from("Line1\nLine2")) }
它适用于简单字符串,但对于多行错误,显示\n或\r\n而不是换行符。如何正确显示换行符?
\n
\r\n
iklwldmw1#
内置的打印就不行了,因为它总是使用Debug。但是你可以打印你自己的格式。你甚至可以有一个小的 Package 器,将Debug转发到Display,有一个方便的错误处理(但它可能与本身不是错误类型但可转换成错误类型的类型断开,这将隐式地使用错误类型运算符,但需要使用PrettyError进行显式转换。但是,如果您只在main()中保留PrettyError,则应该足够了):
Debug
Display
PrettyError
main()
use std::fmt; pub struct PrettyError<T>(pub T); impl<T> From<T> for PrettyError<T> { fn from(v: T) -> Self { Self(v) } } impl<T: fmt::Display> fmt::Debug for PrettyError<T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Display::fmt(&self.0, f) } } fn main() -> Result<(), PrettyError<String>> { Err(String::from("Line1\nLine2"))?; Ok(()) } // Or fn main() -> Result<(), PrettyError<String>> { Err(PrettyError(String::from("Line1\nLine2"))) }
1条答案
按热度按时间iklwldmw1#
内置的打印就不行了,因为它总是使用
Debug
。但是你可以打印你自己的格式。你甚至可以有一个小的 Package 器,将Debug
转发到Display
,有一个方便的错误处理(但它可能与本身不是错误类型但可转换成错误类型的类型断开,这将隐式地使用错误类型运算符,但需要使用PrettyError
进行显式转换。但是,如果您只在main()
中保留PrettyError
,则应该足够了):