Rust LT #6 で発表したスライド
Error
トレイトについて
std::error::Error
トレイトとは
- 2014 年 10 月 にRFC 入りしたトレイト (rfcs#201)
- Rust 1.0 の半年前
-
Box<dyn Error>
として使うことを想定
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<dyn Error>
の代わりに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 が増殖中
などなど
おわり
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
?
andcatch
#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 inio::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<Error>
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:
?
inmain
#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:
?
inmain
#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
fortry { .. }
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
- 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 aResult<_, &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
forBox<dyn Error>
#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<error::Error>>
https://www.reddit.com/r/rust/comments/br2gut/returning_errors_result_boxerrorerror/ - 2019-05-22 - https://twitter.com/wx257osn2/status/1131255087379013632