В настоящее время я превращаю Result
в экземпляр моего перечисления ошибок, который подразумевает Fail
, например:
fn bbswitch_write(data: &str) -> Result<(), BbswitchError> {
match fs::write("/proc/acpi/bbswitch", data) {
Ok(_) => Ok(()),
Err(e) => Err(BbswitchError::BbswitchNotAvailable { cause: e }.into()),
}
}
, но это звучит очень многословно, и я бы не стал писатьоператор match
в четыре строки каждый раз, когда я делаю что-то вроде этого:
let contents = fs::read_to_string("/proc/acpi/bbswitch").expect("bbswitch not available");
Есть ли что-то, что я делаю неправильно, что делает обработку ошибок неоправданно сложной, или способ, которым я мог бы сделать что-то лучше, чтобы сделатьэто удобнее?
Остальная часть моего кода выглядит примерно так:
#[macro_use]
extern crate failure;
use std::fs;
use std::process::exit;
use failure::Error;
#[derive(Debug, Fail)]
enum BbswitchError {
#[fail(display = "bbswitch not available")]
BbswitchNotAvailable {
#[fail(cause)]
cause: std::io::Error,
},
}
fn bbswitch_write(data: &str) -> Result<(), Error> {
match fs::write("/proc/acpi/bbswitch", data) {
Ok(_) => Ok(()),
Err(e) => Err(BbswitchError::BbswitchNotAvailable { cause: e }.into()),
}
}
fn power_on() -> Result<(), Error> {
bbswitch_write("ON")?;
Ok(())
}
fn main() {
match power_on() {
Ok(_) => {},
Err(_) => exit(1),
}
}