#failure #error #fail #abstraction #system #management #traits

已废弃 无需std drone-mirror-failure

实验性错误处理抽象

2 个版本

使用旧的Rust 2015

0.1.2 2018年8月20日
0.1.1 2018年4月30日

#31 in #fail


5 个crate中使用(2 直接使用)5 个crate (2 直接使用)

MIT/Apache

62KB
1K SLoC

failure - 一个新的错误管理故事

Build Status Latest Version docs

failure旨在使在Rust中管理错误更加容易。它旨在用基于过去几年学习到的新系统来替换基于std::error::Error的错误管理。

failure提供了两个核心组件

  • Fail: 一个用于自定义错误类型的新的trait。
  • Error: 一个任何实现Fail的类型都可以转换成的struct。

进化

Failure目前作为一个库在进化。首先,在Rust本身中正在进行工作来修复错误trait,其次,Failure向1.0的原始计划可能不会以当前的形式实现。

因此,原始的1.0版本的master分支已被删除,现在master代表0.1版本的未来的迭代步骤,直到stdlib的情况变得明朗。

原始的1.0分支可以在evolution/1.0中找到。

示例

extern crate serde;
extern crate toml;

#[macro_use] extern crate failure;
#[macro_use] extern crate serde_derive;

use std::collections::HashMap;
use std::path::PathBuf;
use std::str::FromStr;

use failure::Error;

// This is a new error type that you've created. It represents the ways a
// toolchain could be invalid.
//
// The custom derive for Fail derives an impl of both Fail and Display.
// We don't do any other magic like creating new types.
#[derive(Debug, Fail)]
enum ToolchainError {
    #[fail(display = "invalid toolchain name: {}", name)]
    InvalidToolchainName {
        name: String,
    },
    #[fail(display = "unknown toolchain version: {}", version)]
    UnknownToolchainVersion {
        version: String,
    }
}

pub struct ToolchainId {
    // ... etc
}

impl FromStr for ToolchainId {
    type Err = ToolchainError;

    fn from_str(s: &str) -> Result<ToolchainId, ToolchainError> {
        // ... etc
    }
}

pub type Toolchains = HashMap<ToolchainId, PathBuf>;

// This opens a toml file containing associations between ToolchainIds and
// Paths (the roots of those toolchains).
//
// This could encounter an io Error, a toml parsing error, or a ToolchainError,
// all of them will be thrown into the special Error type
pub fn read_toolchains(path: PathBuf) -> Result<Toolchains, Error>
{
    use std::fs::File;
    use std::io::Read;

    let mut string = String::new();
    File::open(path)?.read_to_string(&mut string)?;

    let toml: HashMap<String, PathBuf> = toml::from_str(&string)?;

    let toolchains = toml.iter().map(|(key, path)| {
        let toolchain_id = key.parse()?;
        Ok((toolchain_id, path))
    }).collect::<Result<Toolchains, ToolchainError>>()?;

    Ok(toolchains)
}

要求

failure和failure_derive都旨在在所有高于1.18.0的稳定版本的Rust以及最新的beta和nightly版本上编译。如果任何一个crate在任何高于1.18.0的版本上无法编译,请提交一个问题。

failure与no_std兼容,尽管它的一些方面(主要是Error类型)在no_std模式下不可用。

许可

failure许可协议为MIT许可证或Apache许可证2.0,由您选择。

行为准则

failure crate的贡献受贡献者协约的约束,failure的维护者@withoutboats承诺将介入以维护该行为准则。

依赖关系

~0–780KB
~16K SLoC