Rust LT #6 で発表したスライド

Error トレイトについて


std::error::Error トレイトとは

    • 2014 年 10 月 にRFC 入りしたトレイト (rfcs#201)

 

    • Rust 1.0 の半年前

Box として使うことを想定


Error トレイト

こんなの

pub trait Error: Debug + Display {
    fn description(&self) -> &str;
    fn cause(&self) -> Option<&dyn std::error::Error>;
}

Error::description でエラーの内容を表示できる

println!("{}", err.description());

Error::cause でエラーの元を辿れる (cause chain)

let mut cause = err.cause();
while let Some(err) = cause {
  println!("{}", err.description());
  cause = err.cause();
}

Error トレイトの問題点


1. Error と Debug と Display トレイトを実装しないといけない

Error を derive できない(※当時は derive macro などなかった)


#[derive(Debug)]
enum MyError {
    Io(std::io::Error),
    Parse(std::num::ParseIntError),
}

// ボイラープレート
// pub trait Error: Debug + Display { ... }
impl std::error::Error for MyError {
    fn description(&self) -> &str {
        match *self {
            MyError::Io(ref err) => err.description(),
            MyError::Parse(ref err) => err.description(),
        }
    }
    fn cause(&self) -> Option<&std::error::Error> {
        match *self {
            MyError::Io(ref err) => Some(err),
            MyError::Parse(ref err) => Some(err),
        }
    }
}

impl std::fmt::Display for MyError {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        match *self {
            MyError::Io(ref err) => write!(f, "ファイル開けへんやんけ: {}", err),
            MyError::Parse(ref err) => write!(f, "パースできへんやんけ: {}", err),
        }
    }
}

2. スタックトレースがとれない

このエラーはどこから来たのかなんもわからん


3. Error::description と Display で役割が被ってる

// 何が違うの?
println!("{}", err.description());
println!("{}", err);

4. cause チェーンがイテラブルでない

// なぜそこで while
let mut cause = err.cause();
while let Some(err) = cause {
  cause = err.cause();
}

5. 元のエラー型にダウンキャストできない

// Error::cause の戻り値に 'static がついてない
let cause: Option<&Error> = err.cause();

6. Send も Sync も ‘static ない

tokio などで使うのが大変


結論: Error トレイトは問題だらけなので……

    • error-chain

問題だらけの Error を使うためのベストプラクティス

failure

そもそも Error なんて使わんきゃええ

RFC2504, “Fix the Error Trait”

いっそ Error を改善しよう


error-chain について


error-chain クレート

    • Rust 1.0 の半年後の 2016 年 1 月に作られた

3 年後の 2019 年に開発停止


error_chain! マクロ

マクロで Error トレイトのボイラープレートを一括生成できる


error_chain!{
  types {  MyError, MyErrorKind, MyResultExt, MyResult; }
  links {
    Another(AnotherError, AnotherErrorKind);
  }
  foreign_links {
    Io(::std::io::Error);
  }
  errors {
    CannotOpenFile(path: String) {
      description("cannot open file")
      display("CannotOpenFile: '{}'", path)
    }
  }
}

この error_chain! マクロで生成されるコードは……


Error トレイトを実装した MyError 構造体

pub struct MyError { ... }
impl MyError { ... }
// Error トレイト の実装
impl Error for MyError { ... }
impl Debug for MyError { ... }
impl Display for MyError { ... }

エラー原因を保持するための MyErrorKind 列挙体

pub enum MyErrorKind {
  Msg(String),
  Another(AnotherErrorKind),
  Io(::std::io::Error),
  CannotOpenFile(path: String),
}
impl MyErrorKind { ... }
impl Debug for MyErrorKind { ... }
impl Display for MyErrorKind { ... }

error_chain::ChainedError 拡張トレイトの実装

impl error_chain::ChainedError for MyError { ... }

ChainedError を Result で使えるようにする ResultExt トレイトの実装

pub trait MyResultExt<T> { ... }
pub type MyResult<T> = Result<T, MyError>;

From トレイトの実装

impl From<MyErrorKind> for MyError { ... }
impl<'a> From<&'a str> for MyError { ... }
impl From<String> for MyError { ... }
impl From<another_errors::Error> for MyError { ... }
impl<'a> From<&'a str> for MyErrorKind { ... }
impl From<String> for MyErrorKind { ... }
impl From<MyError> for MyErrorKind  { ... }
impl From<another_errors::ErrorKind> for MyErrorKind { ... }

この膨大なコードのおかげで……


1. enum ErorrKind に原因のエラーを持てる

pub enum MyErrorKind {
  Msg(String),
  Another(AnotherErrorKind),
  Io(::std::io::Error),
  CannotOpenFile(path: String),
}

2. エラーチェーンを積める

use std::fs::File;
use errors::{MyError, MyErrorKind, MyResultExt};
try!(File::open("foo.txt")
  .map_err(MyErrorKind::Io)
  .chain_err(|| "ファイル開けへんやんけ"));
  .chain_err(|| MyErrorKind::CannotOpenFile("foo.txt".to_string)));
// CannotOpenFile -> Msg -> Io -> std::io::Error

3. MyError::iter で原因をイテレートできる

for err in err.iter() {
  println!("{}", err);
}

4. MyError::backtrace でバックトレースがとれる

// need RUST_BACKTRACE=1
if let Some(trace) = err.backtrace() {
  // io::Error ではなく MyError が作られた時点のトレースが得られる
  println!("{:?}", trace);
}

error-chain の問題点

    • derive macro なんてなかった

 

    • 生成されるコードが 膨大

初見殺し
生成される MyError が !Sync で使い勝手が悪い


結論: error-chain は過去の遺産


じゃあ failure を使えばいいのか?


failure について


failure クレート

    • 2017 年 11 月に登場

 

    • 問題だらけの Error トレイトを置き換えるために開発された

Error トレイトの代わりに Fail トレイトを導入

Box の代わりに failure::Error 構造体を導入


derive できる

#[derive(Debug, Fail)]
pub enum MyError {
  #[fail(display = "Input was invalid UTF-8 at index {}", _0)]
  Utf8Error(usize),
  #[fail(display = "IoError: {}", _0)]
  Io(#[cause] io::Error),
}

cause chain がイテラブル

impl Fail {
  pub fn iter_causes(&self) -> Causes { ... }
  ...
}

backtrace が取れる

pub trait Fail: Display + Debug + Send + Sync + 'static {
  fn backtrace(&self) -> Option<&Backtrace> { ... }
  ...
}

Fail に Send + Sync + ‘static がついてる

tokio でも使える

pub trait Fail: Display + Debug + Send + Sync + 'static {
  ...
}

ダウンキャストできる

Fail に ‘static がついてるので

pub trait Fail: Display + Debug + Send + Sync + 'static {
  ...
}
impl Fail {
  pub fn downcast_ref<T: Fail>(&self) -> Option<&T> { ... }
  pub fn downcast_mut<T: Fail>(&mut self) -> Option<&mut T> { ... }
  ...
}

cause chain を積める

err
 .context(format_err!("Error code: なんかエラーおきた}"))
 .context("なんかエラーおきた".to_string());

結論: failure はすごくいいが……


RFC 2504, “Fix the Error trait”


新しい Error トレイト

    • failure から半年後の 2018 年 7 月に提案、 8 月にマージ

failure の知見を取り込んだ改善


新しい Error トレイト

    • backtrace できる

 

    ダウンキャストできる
trait Error: Display + Debug {
    fn backtrace(&self) -> Option<&Backtrace>;
    fn source(&self) -> Option<&dyn Error + 'static>;
}

新しい Error トレイト

以前のメソッドがひとつも残ってない

trait Error: Display + Debug {
    fn backtrace(&self) -> Option<&Backtrace>;
    fn source(&self) -> Option<&dyn Error + 'static>;
}

未解決の問題

    • Backtrace の具体的な API が未定

 

    • イテラブルな cause chain の API が未定

derive(Error) できない


2019年6月現在


error-chain は開発停止


failure は凍結

    • メジャーアップデートはは実装が落ち着くまで停止中 (まるで futures-0.1 のよう?)

Fail -はErrorExt にして新 Error トレイトを継承するかも

failure::Error はfailure::DefaultError になるかも


ポスト failure が増殖中

    • err-derive

 

    • SNAFU

 

    errer

などなど


おわり


Appendix. Rust のエラーまわりの歴史

2014

    • 2014-05-24 – Error handling in Rust is actually pretty awesome. – https://news.ycombinator.com/item?id=7792438

2014-08-16 – RFC: error interoperation #201 – https://github.com/rust-lang/rfcs/pull/201

2014-08-16 – 0.0.0 – https://github.com/reem/rust-error/

2014-08-30 – RFC: Error conventions #220 – https://github.com/rust-lang/rfcs/pull/220

2014-09-17 – First-class error handling with ? and catch #243 – https://github.com/rust-lang/rfcs/pull/243

2014-10-13 – RFC: Anonymous enum types called joins, as A | B #402 – https://www.reddit.com/r/rust/comments/2j1k4h/how_do_i_handle_causes_with_generic_error_handling/

2014-10-16 – On Error Handling in Rust – http://lucumr.pocoo.org/2014/10/16/on-error-handling/

2014-10-16 – https://github.com/rust-lang/rfcs/pull/402

2014-10-30 – RFC: Error conventions, take 3 #236 – https://github.com/rust-lang/rfcs/pull/236

2014-10-31 – https://github.com/rust-lang/rfcs/blob/master/text/0236-error-conventions.md

2014-11-06 – http://lucumr.pocoo.org/2014/11/6/error-handling-in-rust/

2014-11-21 – Error Handling – https://doc.rust-lang.org/1.0.0/book/error-handling.html – https://github.com/rust-lang/book

2014-12-11 – Anonymous enum types (A|B) take 2 #514 – https://github.com/rust-lang/rfcs/pull/514

2015

    • 2015-01-29 – Extensible enums #757 – https://github.com/rust-lang/rfcs/pull/757

2015-04-07 – Consider changing io::Error to use Arc so it can implement Clone #24135 – https://github.com/rust-lang/rust/issues/24135

2015-04-11 – Add Sync to the bounds in io::Error #24133 – https://github.com/rust-lang/rust/pull/24133

2015-04-12 – RFC for adding Sync to io::Error #1057 – https://github.com/rust-lang/rfcs/pull/1057

2015-05-13 – Quick draft “Result::expect” rfc #1119 – https://github.com/rust-lang/rfcs/pull/1119

2015-05-14 – Error Handling in Rust – https://blog.burntsushi.net/rust-error-handling/

2015-06-02 – Error handling in Rust – https://xania.org/201506/rust-errors

2015-07-24 – RFC: Stabilize catch_panic #1236 – https://github.com/rust-lang/rfcs/pull/1236

2015-08-16 – 0.1.1 – https://crates.io/crates/enum_derive

2015-08-29 – RFC : Try-Catch Blocks – https://users.rust-lang.org/t/rfc-try-catch-blocks/2663

2015-09-10 – 0.1.0 – https://github.com/tailhook/quick-error

2015-09-13 – Compare enums only by variant, not value – https://stackoverflow.com/questions/32554285/compare-enums-only-by-variant-not-value

2015-10-08 – Allow a custom panic handler #1328 – https://github.com/rust-lang/rfcs/pull/1328

2015-11-02 – RUST AND GO (ERROR HANDLING) – http://tyoverby.com/posts/rust-vs-go.html

2015-12-02 – String, From and Box interoperation could be better. #30156 – https://github.com/rust-lang/rust/issues/30156

2016

    • 2016-01-08 – Announcing error-chain, a library for consistent and reliable Rust error handling – https://users.rust-lang.org/t/announcing-error-chain-a-library-for-consistent-and-reliable-rust-error-handling/6133

2016-03-29 – Error Handling in Rust – https://facility9.com/2016/03/error-handling-in-rust/

2016-03-24 – 0.1.0 – https://crates.io/crates/simple-error

2016-04-13 – 0.2.0 – https://github.com/rust-lang/backtrace-rs

2016-04-29 – 0.1.8- https://crates.io/crates/error-chain

2016-05-18 – Adding Context to Rust Errors – https://medium.com/@paulcolomiets/adding-context-to-rust-errors-3c6f58a7074b

2016-05-27 – Rust 1.9 improves speed, error handling – https://www.infoworld.com/article/3075321/rust-19-improves-speed-error-handling.html

2016-06-08 – Why I’m dropping Rust – https://users.rust-lang.org/t/announcing-error-chain-a-library-for-consistent-and-reliable-rust-error-handling/6133

2016-07-16 – Can’t to introspect error cause – https://users.rust-lang.org/t/cant-to-introspect-error-cause/6536

2016-07-21 – Elegant Library APIs in Rust – https://deterministic.space/elegant-apis-in-rust.html

2016-07-22 – Rust – Custom Error Types | rust Tutorial – RIP Tutorial – https://riptutorial.com/rust/example/6788/custom-error-types

2016-08-01 – Add a compile_error! macro to libstd #1695 – https://github.com/rust-lang/rfcs/pull/1695

2016-08-03 – Helping with the Rust Errors – https://www.jonathanturner.org/2016/08/helping-out-with-rust-errors.html

2016-08-14 – Problems getting error description in Rust – https://stackoverflow.com/questions/38936996/problems-getting-error-description-in-rust

2016-08-24 – Error causes can’t be downcast #35943 – https://github.com/rust-lang/rust/issues/35943

2016-09-11 – The Error Model – http://joeduffyblog.com/2016/02/07/the-error-model/

2016-10-24 – Accumulating Results in Rust With Validated – https://beachape.com/blog/2016/10/24/accumulating-results-in-rust-with-validated/

2016-10-27 – Rewinding time with rr & Rust to debug a terrible error message – https://blog.faraday.io/reversing-rust-debugging-a-terrible-error-message-backwards-in-time-with-rr-2/

2016-11-20 – Error-chain 0.6.0 – https://users.rust-lang.org/t/error-chain-0-6-0/8079/2

2016-11-21 – 0.2.0 – https://crates.io/crates/macro_attr

2016-11-30 – Starting a new Rust project right, with error-chain – https://brson.github.io/2016/11/30/starting-with-error-chain

2016-12-01 – Starting a new Rust project right, with error-chain – https://www.reddit.com/r/rust/comments/5ftgv5/starting_a_new_rust_project_right_with_errorchain/

2016-12-15 – Stroustrup’s Rule and Layering Over Time – https://thefeedbackloop.xyz/stroustrups-rule-and-layering-over-time/ – https://news.ycombinator.com/item?id=13192052

2016-12-18 – 24 days of Rust – error_chain – https://siciarz.net/24-days-rust-error_chain/

2017

    • 2017-01-16 – 0.0.0 – https://crates.io/crates/derive-error

2017-01-20 – RFC 1859: Tryトレイト – https://github.com/rust-lang/rfcs/pull/1859 – https://gist.github.com/sile/7b967511f9d922ecfab80dc27d17d82d

2017-02-06 – Custom Error types in Rust and the ? operator – https://medium.com/@fredrikanderzon/custom-error-types-in-rust-and-the-operator-b499d0fb2925

2017-02-11 – A way to customize Rust error messages – https://deterministic.space/hook-into-rustc-errors.html

2017-02-15 – Nice error handling in Rust – https://www.reddit.com/r/rust/comments/5u0vkk/nice_error_handling_in_rust/

2017-02-22 – RFC: ? in main #1937 – https://github.com/rust-lang/rfcs/pull/1937

2017-03-03 – How do you define custom Error types in Rust? – https://stackoverflow.com/questions/42584368/how-do-you-define-custom-error-types-in-rust/42584607#42584607

2017-03-13 – Rustでエラーを合成する – https://qiita.com/termoshtt/items/8c015d9289613ec640f1/revisions

2017-03-22 – Error Handling – https://stevedonovan.github.io/rust-gentle-intro/6-error-handling.html

2017-04-02 – Pre RFC ish: Bring ensure! macro from error-chain into std? – https://users.rust-lang.org/t/pre-rfc-ish-bring-ensure-macro-from-error-chain-into-std/10181

2017-05-06 – Error types – as enums or as structs – https://users.rust-lang.org/t/error-types-as-enums-or-as-structs/9797/3

2017-05-24 – Future-proofing enums/structs with #[non_exhaustive] attribute #2008 – https://github.com/rust-lang/rfcs/pull/2008

2017-06-03 – Rustのtry-catch構文 – https://qnighy.hatenablog.com/entry/2017/06/03/070000

2017-06-06 – Refactor error types #936 – https://github.com/diesel-rs/diesel/issues/936

2017-07-18 – Tracking issue for RFC 1937: ? in main #43301 – https://github.com/rust-lang/rust/issues/43301

2017-08-27 – Tracking issue for RFC 2008: Future-proofing enums/structs with #[non_exhaustive] attribute #44109 – https://github.com/rust-lang/rust/issues/44109

2017-09-17 – Rust でエラー型に Clone が実装されていてほしい – https://blog.cardina1.red/2017/09/15/rust-clonable-error-types/

2017-10-26 – Improve errors and error handling #460 – https://github.com/amethyst/amethyst/issues/460

2017-11-03 – Rust futures: an uneducated, short and hopefully not boring tutorial – Part 2 – https://dev.to/mindflavor/rust-futures-an-uneducated-short-and-hopefully-not-boring-tutorial—part-2-8dd

2017-11-04 – Improving error matching consistency (at least for testing) – https://github.com/rust-lang-nursery/failure/issues/14

2017-11-16 – Announcing Failure – https://boats.gitlab.io/blog/post/2017-11-16-announcing-failure/

2017-11-17 – Announcing Failure – https://www.reddit.com/r/rust/comments/7dg95u/announcing_failure/

2017-11-20 – Rustの『RFC 2113: dynトレイト構文』の要約メモ – https://gist.github.com/sile/0615a6daa1f5576d63c8775cc5a94f88

2017-11-24 – Consider examples for “failure” crate? #370 – https://github.com/rust-lang-nursery/rust-cookbook/issues/370

2017-11-30 – Failure 0.1.1 released – https://boats.gitlab.io/blog/post/2017-11-30-failure-0-1-1/

2017-11-30 – Bury Error::description() #2230 – https://github.com/rust-lang/rfcs/pull/2230

2017-12-03 – error-chain and failure – https://amp.reddit.com/r/rust/comments/7h8v1z/errorchain_and_failure/

2018

    • 2018-01-06 – https://mobile.twitter.com/qnighy/status/949648140759572480

2018-01-22 – Dyn Trait & #[derive(Debug, Fail)] – https://users.rust-lang.org/t/dyn-trait-derive-debug-fail/18250

2018-02-03 – Any plans for clonable errors? #148 – https://github.com/rust-lang-nursery/failure/issues/148

2018-02-18 – Rustのパニック機構 – https://qnighy.hatenablog.com/entry/2018/02/18/223000

2018-02-22 – Failure 1.0.0 on March 15 – https://boats.gitlab.io/blog/post/2018-02-22-failure-1.0/

2018-03-02 – Rustのエラーハンドリング – https://medium.com/@11Takanori/rust%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AA%E3%83%B3%E3%82%B0-6660cd4d16c0

2018-03-08 – error-chain deprecation #181 – https://github.com/rust-lang-nursery/failure/issues/181

2018-03-09 – Redefining Failure – https://epage.github.io/blog/2018/03/redefining-failure/

2018-04-04 – Migrate application from error-chain to failure – https://users.rust-lang.org/t/migrate-application-from-error-chain-to-failure/16601

2018-04-04 – RFC: Reserve try for try { .. } block expressions #2388 – https://github.com/rust-lang/rfcs/pull/2388

2018-04-29 – https://cat-in-136.github.io/2018/04/rust-error-handling-question.html

2018-05-03 – “TL;DR – I think showing the Debug message of an error was a mistake, and that a better choice would be to use the Display message of an error.” – https://github.com/rust-lang/rust/issues/43301#issuecomment-388575730

2018-05-26 – Maintainership of failure #209 – https://github.com/rust-lang-nursery/failure/issues/209

2018-06-30 – rust のエラーライブラリは failure を使え! – https://qiita.com/legokichi/items/d76b6aa5dac2ad781bda

2018-07-19 – Fix the Error trait #2504 – https://github.com/rust-lang/rfcs/pull/2504

https://boats.gitlab.io/failure/error-msg.html

2018-07-22 – https://mobile.twitter.com/qnighy/status/1021021205166297090

2018-08-14 – Custom error guidelines? – https://users.rust-lang.org/t/custom-error-guidelines/19547

2018-08-19 – Tracking issue for RFC 2504, “Fix the Error trait” #53487 – https://github.com/rust-lang/rust/issues/53487

2018-10-08 – Current state of error handling in Rust? https://www.reddit.com/r/rust/comments/9m5w9a/current_state_of_error_handling_in_rust/

2018-11-02 – 1.0.0 – https://crates.io/crates/custom_error

2018-11-21 – impl Error for String – https://internals.rust-lang.org/t/impl-error-for-string/8881

2018-12-02 – Rust ergonomics for error handling #23 – https://github.com/awslabs/aws-lambda-rust-runtime/issues/23

2018-12-04 – Rustのエラー処理 – https://qiita.com/fujitayy/items/cafe661415b6aa33d884

2018-12-05 – on error handling #502 – https://github.com/rust-lang-nursery/rust-cookbook/issues/502

2018-12-05 – Introduce amethyst_error #1220 – https://github.com/amethyst/amethyst/pull/1220

2018-12-15 – The state of error handling in the 2018 edition – https://users.rust-lang.org/t/the-state-of-error-handling-in-the-2018-edition/23263

2018-12-18 – Announcing err-derive – yet another error handling library – https://users.rust-lang.org/t/announcing-err-derive-yet-another-error-handling-library/23594

2018-12-18 – [RFC] Error handling in Rust runtime #54 – https://github.com/awslabs/aws-lambda-rust-runtime/issues/54

2018-12-18 – [RFC] Runtime crates refactor #53 – https://github.com/awslabs/aws-lambda-rust-runtime/issues/53

2018-12-19 – Fail-rs 0.2.1 released – https://users.rust-lang.org/t/fail-rs-0-2-1-released/23355

2018-12-30 – Towards 0.2 and Beyond #287 – https://github.com/rust-lang-nursery/failure/issues/287

2019

    • 2019-01-07 – How to port error_chain to 2018? – https://users.rust-lang.org/t/how-to-port-error-chain-to-2018/23960

2019-01-13 – Best practice to return a Result<_, impl Error> and not a Result<_, &str> in Rust? – https://stackoverflow.com/questions/54159232/best-practice-to-return-a-result-impl-error-and-not-a-result-str-in-rus

2019-01-15 – The Evolution of a Rust Programmer – http://antoyo.ml/evolution-rust-programmer

2019-01-19 – 0.1.0 – https://crates.io/crates/errer

2019-01-20 – Rustでtraitのassociated typeに対してtrait boundaryを課す – https://in-neuro.hatenablog.com/entry/2019/01/20/210653

2019-01-21 – 0.1.0 – https://crates.io/crates/easy-error

2019-01-28 – 0.1.0 – https://crates.io/crates/snafu

2019-02-09 – Custom Exit Status Codes with ? in main – https://www.joshmcguigan.com/blog/custom-exit-status-codes-rust/

2019-02-17 – Tracking issue for error source iterators #58520 – https://github.com/rust-lang/rust/issues/58520

2019-03-01 – Rust: failureを用いたエラー型定義 – https://qiita.com/OvQ/items/cb866c04196dc59fe847

2019-03-02 – std: implement Error for Box #58859 – https://github.com/rust-lang/rust/pull/58859

2019-03-11 – RFC 2504 “fix_error”: Rustの新たなErrorトレイト – https://qiita.com/termoshtt/items/830008898f90c647a971

2019-03-22 – On error handling – https://users.rust-lang.org/t/on-error-handling/26515

2019-03-27 – 0.1.1 – https://crates.io/crates/error-rules

2019-04-02 – Review and address feedback #46 – https://github.com/shepmaster/snafu/issues/46#issuecomment-486482005

2019-04-09 – rust-lang/rustlings/exercises/error_handling/ – https://github.com/rust-lang/rustlings/tree/d7e58ee1af3945dc2b13f2ebb9daa7c2b2a26175/exercises/error_handling

2019-04-15 – SNAFU 0.2.1 Released – https://users.rust-lang.org/t/snafu-0-2-1-released/27269

2019-04-19 – removed error-chain from examples having only one error variant #525 – https://github.com/rust-lang-nursery/rust-cookbook/pull/525

2019-04-24 – Error-chain is no longer maintained – https://users.rust-lang.org/t/error-chain-is-no-longer-maintained/27561

2019-04-25 – Failing to port from error-chain to std error handling – https://users.rust-lang.org/t/failing-to-port-from-error-chain-to-std-error-handling/27611

2018-04-25 – Any experiences with snafu? – https://www.reddit.com/r/rust/comments/bgy80y/any_experiences_with_snafu/

2019-04-26 – Today, I would probably not use any error handling helper library for a library. – https://users.rust-lang.org/t/error-chain-is-no-longer-maintained/27561/8

2019-04-29 – Rust’s 2019 roadmap – https://www.reddit.com/r/rust/comments/bgikmz/rusts_2019_roadmap/eln8h8y/

2019-05-13 – Security advisory for the standard library -https://blog.rust-lang.org/2019/05/13/Security-advisory.html

2019-05-21 – Returning errors: -> Result<(), Box> https://www.reddit.com/r/rust/comments/br2gut/returning_errors_result_boxerrorerror/

2019-05-22 – https://twitter.com/wx257osn2/status/1131255087379013632

bannerAds