【发布时间】:2015-03-07 05:46:48
【问题描述】:
我一直在摸索 Rust 的文档,试图执行一个简单的深奥示例,而不是为了我自己的教育利益而不是实用性。这样做时,我似乎无法理解如何使用 Rust 的错误处理。
我正在使用的编程示例是编写一个在 shell 中运行命令的函数。从命令的结果中我想检索stdout(作为String 或&str)并知道命令是否失败。
std::process::Command 结构为我提供了我想要的方法,但似乎将它们组合起来的唯一方法是笨拙和笨拙:
use std::process::Command;
use std::string::{String, FromUtf8Error};
use std::io::Error;
enum CmdError {
UtfError(FromUtf8Error),
IoError(Error),
}
// I would really like to use std::error::Error instead of CmdError,
// but the compiler complains about using a trait in this context.
fn run_cmd(cmd: &str) -> Result<String, CmdError> {
let cmd_result = Command::new("sh").arg("-c").arg(cmd).output();
match cmd_result {
Err(e) => {
return Err(CmdError::IoError(e));
}
Ok(v) => {
let out_result = String::from_utf8(v.stdout);
match out_result {
Err(e) => {
return Err(CmdError::UtfError(e));
}
Ok(v) => {
return Ok(v);
}
}
}
}
}
fn main() {
let r = run_cmd("echo 'Hello World!'");
match r {
Err(e) => {
match e {
CmdError::IoError(e) => {
panic!("Failed to run command {:}", e);
}
CmdError::UtfError(e) => {
panic!("Failed to run command {:}", e);
}
}
}
Ok(e) => {
print!("{:}", e);
}
}
}
尤其是run_cmd里面的嵌套匹配块看起来真的很别扭,main里面的嵌套匹配块就更糟了。
我真正想做的是能够使用比FromUtf8Error 或io::Error 更通用的错误类别,我可以轻松地从任一具体类型转换成类型,但它不会出现类型系统是这样设计的,所以我不得不使用粗略的CmdError 来代替union type。
我确信有一种更简单的方法可以做到这一点,而且更惯用,但到目前为止我还没有从我读过的文档中找到它。
感谢任何pointers。
【问题讨论】:
标签: rust