{"id":44961,"date":"2023-01-16T00:26:39","date_gmt":"2022-11-05T01:05:50","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/44961-2\/"},"modified":"2024-04-29T10:03:16","modified_gmt":"2024-04-29T02:03:16","slug":"44961-2","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/44961-2\/","title":{"rendered":""},"content":{"rendered":"<p>Rust LT #6 \u3067\u767a\u8868\u3057\u305f\u30b9\u30e9\u30a4\u30c9<\/p>\n<h1>Error \u30c8\u30ec\u30a4\u30c8\u306b\u3064\u3044\u3066<\/h1>\n<hr \/>\n<h2>std::error::Error \u30c8\u30ec\u30a4\u30c8\u3068\u306f<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">2014 \u5e74 10 \u6708 \u306bRFC \u5165\u308a\u3057\u305f\u30c8\u30ec\u30a4\u30c8 (rfcs#201)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Rust 1.0 \u306e\u534a\u5e74\u524d<\/ul>\n<\/li>\n<\/ul>\n<p>Box \u3068\u3057\u3066\u4f7f\u3046\u3053\u3068\u3092\u60f3\u5b9a<\/p>\n<hr \/>\n<h2>Error \u30c8\u30ec\u30a4\u30c8<\/h2>\n<p>\u3053\u3093\u306a\u306e<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">pub<\/span> <span class=\"k\">trait<\/span> <span class=\"n\">Error<\/span><span class=\"p\">:<\/span> <span class=\"n\">Debug<\/span> <span class=\"o\">+<\/span> <span class=\"n\">Display<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">fn<\/span> <span class=\"nf\">description<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">fn<\/span> <span class=\"nf\">cause<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;&amp;<\/span><span class=\"n\">dyn<\/span> <span class=\"nn\">std<\/span><span class=\"p\">::<\/span><span class=\"nn\">error<\/span><span class=\"p\">::<\/span><span class=\"n\">Error<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>Error::description \u3067\u30a8\u30e9\u30fc\u306e\u5185\u5bb9\u3092\u8868\u793a\u3067\u304d\u308b<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nd\">println!<\/span><span class=\"p\">(<\/span><span class=\"s\">\"{}\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"nf\">.description<\/span><span class=\"p\">());<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>Error::cause \u3067\u30a8\u30e9\u30fc\u306e\u5143\u3092\u8fbf\u308c\u308b (cause chain)<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">let<\/span> <span class=\"k\">mut<\/span> <span class=\"n\">cause<\/span> <span class=\"o\">=<\/span> <span class=\"n\">err<\/span><span class=\"nf\">.cause<\/span><span class=\"p\">();<\/span>\r\n<span class=\"k\">while<\/span> <span class=\"k\">let<\/span> <span class=\"nf\">Some<\/span><span class=\"p\">(<\/span><span class=\"n\">err<\/span><span class=\"p\">)<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cause<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nd\">println!<\/span><span class=\"p\">(<\/span><span class=\"s\">\"{}\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"nf\">.description<\/span><span class=\"p\">());<\/span>\r\n  <span class=\"n\">cause<\/span> <span class=\"o\">=<\/span> <span class=\"n\">err<\/span><span class=\"nf\">.cause<\/span><span class=\"p\">();<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h2>Error \u30c8\u30ec\u30a4\u30c8\u306e\u554f\u984c\u70b9<\/h2>\n<hr \/>\n<h3>1. Error \u3068 Debug \u3068 Display \u30c8\u30ec\u30a4\u30c8\u3092\u5b9f\u88c5\u3057\u306a\u3044\u3068\u3044\u3051\u306a\u3044<\/h3>\n<p>Error \u3092 derive \u3067\u304d\u306a\u3044\uff08\u203b\u5f53\u6642\u306f derive macro \u306a\u3069\u306a\u304b\u3063\u305f\uff09<\/p>\n<hr \/>\n<pre class=\"post-pre\"><code><span class=\"nd\">#[derive(Debug)]<\/span>\r\n<span class=\"k\">enum<\/span> <span class=\"n\">MyError<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nf\">Io<\/span><span class=\"p\">(<\/span><span class=\"nn\">std<\/span><span class=\"p\">::<\/span><span class=\"nn\">io<\/span><span class=\"p\">::<\/span><span class=\"n\">Error<\/span><span class=\"p\">),<\/span>\r\n    <span class=\"nf\">Parse<\/span><span class=\"p\">(<\/span><span class=\"nn\">std<\/span><span class=\"p\">::<\/span><span class=\"nn\">num<\/span><span class=\"p\">::<\/span><span class=\"n\">ParseIntError<\/span><span class=\"p\">),<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c\">\/\/ \u30dc\u30a4\u30e9\u30fc\u30d7\u30ec\u30fc\u30c8<\/span>\r\n<span class=\"c\">\/\/ pub trait Error: Debug + Display { ... }<\/span>\r\n<span class=\"k\">impl<\/span> <span class=\"nn\">std<\/span><span class=\"p\">::<\/span><span class=\"nn\">error<\/span><span class=\"p\">::<\/span><span class=\"n\">Error<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyError<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">fn<\/span> <span class=\"nf\">description<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">match<\/span> <span class=\"o\">*<\/span><span class=\"k\">self<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"nn\">MyError<\/span><span class=\"p\">::<\/span><span class=\"nf\">Io<\/span><span class=\"p\">(<\/span><span class=\"k\">ref<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span> <span class=\"k\">=&gt;<\/span> <span class=\"n\">err<\/span><span class=\"nf\">.description<\/span><span class=\"p\">(),<\/span>\r\n            <span class=\"nn\">MyError<\/span><span class=\"p\">::<\/span><span class=\"nf\">Parse<\/span><span class=\"p\">(<\/span><span class=\"k\">ref<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span> <span class=\"k\">=&gt;<\/span> <span class=\"n\">err<\/span><span class=\"nf\">.description<\/span><span class=\"p\">(),<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">fn<\/span> <span class=\"nf\">cause<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;&amp;<\/span><span class=\"nn\">std<\/span><span class=\"p\">::<\/span><span class=\"nn\">error<\/span><span class=\"p\">::<\/span><span class=\"n\">Error<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">match<\/span> <span class=\"o\">*<\/span><span class=\"k\">self<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"nn\">MyError<\/span><span class=\"p\">::<\/span><span class=\"nf\">Io<\/span><span class=\"p\">(<\/span><span class=\"k\">ref<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span> <span class=\"k\">=&gt;<\/span> <span class=\"nf\">Some<\/span><span class=\"p\">(<\/span><span class=\"n\">err<\/span><span class=\"p\">),<\/span>\r\n            <span class=\"nn\">MyError<\/span><span class=\"p\">::<\/span><span class=\"nf\">Parse<\/span><span class=\"p\">(<\/span><span class=\"k\">ref<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span> <span class=\"k\">=&gt;<\/span> <span class=\"nf\">Some<\/span><span class=\"p\">(<\/span><span class=\"n\">err<\/span><span class=\"p\">),<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">impl<\/span> <span class=\"nn\">std<\/span><span class=\"p\">::<\/span><span class=\"nn\">fmt<\/span><span class=\"p\">::<\/span><span class=\"n\">Display<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyError<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">fn<\/span> <span class=\"nf\">fmt<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">f<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"k\">mut<\/span> <span class=\"nn\">std<\/span><span class=\"p\">::<\/span><span class=\"nn\">fmt<\/span><span class=\"p\">::<\/span><span class=\"n\">Formatter<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nn\">std<\/span><span class=\"p\">::<\/span><span class=\"nn\">fmt<\/span><span class=\"p\">::<\/span><span class=\"n\">Result<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">match<\/span> <span class=\"o\">*<\/span><span class=\"k\">self<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"nn\">MyError<\/span><span class=\"p\">::<\/span><span class=\"nf\">Io<\/span><span class=\"p\">(<\/span><span class=\"k\">ref<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span> <span class=\"k\">=&gt;<\/span> <span class=\"nd\">write!<\/span><span class=\"p\">(<\/span><span class=\"n\">f<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"\u30d5\u30a1\u30a4\u30eb\u958b\u3051\u3078\u3093\u3084\u3093\u3051: {}\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">),<\/span>\r\n            <span class=\"nn\">MyError<\/span><span class=\"p\">::<\/span><span class=\"nf\">Parse<\/span><span class=\"p\">(<\/span><span class=\"k\">ref<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span> <span class=\"k\">=&gt;<\/span> <span class=\"nd\">write!<\/span><span class=\"p\">(<\/span><span class=\"n\">f<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"\u30d1\u30fc\u30b9\u3067\u304d\u3078\u3093\u3084\u3093\u3051: {}\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">),<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>2. \u30b9\u30bf\u30c3\u30af\u30c8\u30ec\u30fc\u30b9\u304c\u3068\u308c\u306a\u3044<\/h3>\n<p>\u3053\u306e\u30a8\u30e9\u30fc\u306f\u3069\u3053\u304b\u3089\u6765\u305f\u306e\u304b\u306a\u3093\u3082\u308f\u304b\u3089\u3093<\/p>\n<hr \/>\n<h3>3. Error::description \u3068 Display \u3067\u5f79\u5272\u304c\u88ab\u3063\u3066\u308b<\/h3>\n<pre class=\"post-pre\"><code><span class=\"c\">\/\/ \u4f55\u304c\u9055\u3046\u306e\uff1f<\/span>\r\n<span class=\"nd\">println!<\/span><span class=\"p\">(<\/span><span class=\"s\">\"{}\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"nf\">.description<\/span><span class=\"p\">());<\/span>\r\n<span class=\"nd\">println!<\/span><span class=\"p\">(<\/span><span class=\"s\">\"{}\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">);<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>4. cause \u30c1\u30a7\u30fc\u30f3\u304c\u30a4\u30c6\u30e9\u30d6\u30eb\u3067\u306a\u3044<\/h3>\n<pre class=\"post-pre\"><code><span class=\"c\">\/\/ \u306a\u305c\u305d\u3053\u3067 while<\/span>\r\n<span class=\"k\">let<\/span> <span class=\"k\">mut<\/span> <span class=\"n\">cause<\/span> <span class=\"o\">=<\/span> <span class=\"n\">err<\/span><span class=\"nf\">.cause<\/span><span class=\"p\">();<\/span>\r\n<span class=\"k\">while<\/span> <span class=\"k\">let<\/span> <span class=\"nf\">Some<\/span><span class=\"p\">(<\/span><span class=\"n\">err<\/span><span class=\"p\">)<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cause<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"n\">cause<\/span> <span class=\"o\">=<\/span> <span class=\"n\">err<\/span><span class=\"nf\">.cause<\/span><span class=\"p\">();<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>5. \u5143\u306e\u30a8\u30e9\u30fc\u578b\u306b\u30c0\u30a6\u30f3\u30ad\u30e3\u30b9\u30c8\u3067\u304d\u306a\u3044<\/h3>\n<pre class=\"post-pre\"><code><span class=\"c\">\/\/ Error::cause \u306e\u623b\u308a\u5024\u306b 'static \u304c\u3064\u3044\u3066\u306a\u3044<\/span>\r\n<span class=\"k\">let<\/span> <span class=\"n\">cause<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;&amp;<\/span><span class=\"n\">Error<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"n\">err<\/span><span class=\"nf\">.cause<\/span><span class=\"p\">();<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>6. Send \u3082 Sync \u3082 &#8216;static \u306a\u3044<\/h3>\n<p>tokio \u306a\u3069\u3067\u4f7f\u3046\u306e\u304c\u5927\u5909<\/p>\n<hr \/>\n<h2>\u7d50\u8ad6: Error \u30c8\u30ec\u30a4\u30c8\u306f\u554f\u984c\u3060\u3089\u3051\u306a\u306e\u3067\u2026\u2026<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">error-chain<\/ul>\n<\/li>\n<\/ul>\n<p>\u554f\u984c\u3060\u3089\u3051\u306e Error \u3092\u4f7f\u3046\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/p>\n<p>failure<\/p>\n<p>\u305d\u3082\u305d\u3082 Error \u306a\u3093\u3066\u4f7f\u308f\u3093\u304d\u3083\u3048\u3048<\/p>\n<p>RFC2504, &#8220;Fix the Error Trait&#8221;<\/p>\n<p>\u3044\u3063\u305d Error \u3092\u6539\u5584\u3057\u3088\u3046<\/p>\n<hr \/>\n<h1>error-chain \u306b\u3064\u3044\u3066<\/h1>\n<hr \/>\n<h2>error-chain \u30af\u30ec\u30fc\u30c8<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Rust 1.0 \u306e\u534a\u5e74\u5f8c\u306e 2016 \u5e74 1 \u6708\u306b\u4f5c\u3089\u308c\u305f<\/ul>\n<\/li>\n<\/ul>\n<p>3 \u5e74\u5f8c\u306e 2019 \u5e74\u306b\u958b\u767a\u505c\u6b62<\/p>\n<hr \/>\n<h3>error_chain! \u30de\u30af\u30ed<\/h3>\n<p>\u30de\u30af\u30ed\u3067 Error \u30c8\u30ec\u30a4\u30c8\u306e\u30dc\u30a4\u30e9\u30fc\u30d7\u30ec\u30fc\u30c8\u3092\u4e00\u62ec\u751f\u6210\u3067\u304d\u308b<\/p>\n<hr \/>\n<pre class=\"post-pre\"><code><span class=\"nd\">error_chain!<\/span><span class=\"p\">{<\/span>\r\n  <span class=\"n\">types<\/span> <span class=\"p\">{<\/span>  <span class=\"n\">MyError<\/span><span class=\"p\">,<\/span> <span class=\"n\">MyErrorKind<\/span><span class=\"p\">,<\/span> <span class=\"n\">MyResultExt<\/span><span class=\"p\">,<\/span> <span class=\"n\">MyResult<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\r\n  <span class=\"n\">links<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nf\">Another<\/span><span class=\"p\">(<\/span><span class=\"n\">AnotherError<\/span><span class=\"p\">,<\/span> <span class=\"n\">AnotherErrorKind<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"n\">foreign_links<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nf\">Io<\/span><span class=\"p\">(::<\/span><span class=\"nn\">std<\/span><span class=\"p\">::<\/span><span class=\"nn\">io<\/span><span class=\"p\">::<\/span><span class=\"n\">Error<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"n\">errors<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nf\">CannotOpenFile<\/span><span class=\"p\">(<\/span><span class=\"n\">path<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nf\">description<\/span><span class=\"p\">(<\/span><span class=\"s\">\"cannot open file\"<\/span><span class=\"p\">)<\/span>\r\n      <span class=\"nf\">display<\/span><span class=\"p\">(<\/span><span class=\"s\">\"CannotOpenFile: '{}'\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">path<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>\u3053\u306e error_chain! \u30de\u30af\u30ed\u3067\u751f\u6210\u3055\u308c\u308b\u30b3\u30fc\u30c9\u306f\u2026\u2026<\/h3>\n<hr \/>\n<h3>Error \u30c8\u30ec\u30a4\u30c8\u3092\u5b9f\u88c5\u3057\u305f MyError \u69cb\u9020\u4f53<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">pub<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">MyError<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"k\">impl<\/span> <span class=\"n\">MyError<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"c\">\/\/ Error \u30c8\u30ec\u30a4\u30c8 \u306e\u5b9f\u88c5<\/span>\r\n<span class=\"k\">impl<\/span> <span class=\"n\">Error<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyError<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"k\">impl<\/span> <span class=\"n\">Debug<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyError<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"k\">impl<\/span> <span class=\"n\">Display<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyError<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>\u30a8\u30e9\u30fc\u539f\u56e0\u3092\u4fdd\u6301\u3059\u308b\u305f\u3081\u306e MyErrorKind \u5217\u6319\u4f53<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">pub<\/span> <span class=\"k\">enum<\/span> <span class=\"n\">MyErrorKind<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nf\">Msg<\/span><span class=\"p\">(<\/span><span class=\"nb\">String<\/span><span class=\"p\">),<\/span>\r\n  <span class=\"nf\">Another<\/span><span class=\"p\">(<\/span><span class=\"n\">AnotherErrorKind<\/span><span class=\"p\">),<\/span>\r\n  <span class=\"nf\">Io<\/span><span class=\"p\">(::<\/span><span class=\"nn\">std<\/span><span class=\"p\">::<\/span><span class=\"nn\">io<\/span><span class=\"p\">::<\/span><span class=\"n\">Error<\/span><span class=\"p\">),<\/span>\r\n  <span class=\"nf\">CannotOpenFile<\/span><span class=\"p\">(<\/span><span class=\"n\">path<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">),<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">impl<\/span> <span class=\"n\">MyErrorKind<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"k\">impl<\/span> <span class=\"n\">Debug<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyErrorKind<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"k\">impl<\/span> <span class=\"n\">Display<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyErrorKind<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>error_chain::ChainedError \u62e1\u5f35\u30c8\u30ec\u30a4\u30c8\u306e\u5b9f\u88c5<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">impl<\/span> <span class=\"nn\">error_chain<\/span><span class=\"p\">::<\/span><span class=\"n\">ChainedError<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyError<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>ChainedError \u3092 Result \u3067\u4f7f\u3048\u308b\u3088\u3046\u306b\u3059\u308b ResultExt \u30c8\u30ec\u30a4\u30c8\u306e\u5b9f\u88c5<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">pub<\/span> <span class=\"k\">trait<\/span> <span class=\"n\">MyResultExt<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"k\">pub<\/span> <span class=\"k\">type<\/span> <span class=\"n\">MyResult<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Result<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">,<\/span> <span class=\"n\">MyError<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>From \u30c8\u30ec\u30a4\u30c8\u306e\u5b9f\u88c5<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">impl<\/span> <span class=\"n\">From<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">MyErrorKind<\/span><span class=\"o\">&gt;<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyError<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"k\">impl<\/span><span class=\"o\">&lt;<\/span><span class=\"nv\">'a<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">From<\/span><span class=\"o\">&lt;&amp;<\/span><span class=\"nv\">'a<\/span> <span class=\"nb\">str<\/span><span class=\"o\">&gt;<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyError<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"k\">impl<\/span> <span class=\"n\">From<\/span><span class=\"o\">&lt;<\/span><span class=\"nb\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyError<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"k\">impl<\/span> <span class=\"n\">From<\/span><span class=\"o\">&lt;<\/span><span class=\"nn\">another_errors<\/span><span class=\"p\">::<\/span><span class=\"n\">Error<\/span><span class=\"o\">&gt;<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyError<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"k\">impl<\/span><span class=\"o\">&lt;<\/span><span class=\"nv\">'a<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">From<\/span><span class=\"o\">&lt;&amp;<\/span><span class=\"nv\">'a<\/span> <span class=\"nb\">str<\/span><span class=\"o\">&gt;<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyErrorKind<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"k\">impl<\/span> <span class=\"n\">From<\/span><span class=\"o\">&lt;<\/span><span class=\"nb\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyErrorKind<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"k\">impl<\/span> <span class=\"n\">From<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">MyError<\/span><span class=\"o\">&gt;<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyErrorKind<\/span>  <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"k\">impl<\/span> <span class=\"n\">From<\/span><span class=\"o\">&lt;<\/span><span class=\"nn\">another_errors<\/span><span class=\"p\">::<\/span><span class=\"n\">ErrorKind<\/span><span class=\"o\">&gt;<\/span> <span class=\"k\">for<\/span> <span class=\"n\">MyErrorKind<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h2>\u3053\u306e\u81a8\u5927\u306a\u30b3\u30fc\u30c9\u306e\u304a\u304b\u3052\u3067\u2026\u2026<\/h2>\n<hr \/>\n<h3>1. enum ErorrKind \u306b\u539f\u56e0\u306e\u30a8\u30e9\u30fc\u3092\u6301\u3066\u308b<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">pub<\/span> <span class=\"k\">enum<\/span> <span class=\"n\">MyErrorKind<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nf\">Msg<\/span><span class=\"p\">(<\/span><span class=\"nb\">String<\/span><span class=\"p\">),<\/span>\r\n  <span class=\"nf\">Another<\/span><span class=\"p\">(<\/span><span class=\"n\">AnotherErrorKind<\/span><span class=\"p\">),<\/span>\r\n  <span class=\"nf\">Io<\/span><span class=\"p\">(::<\/span><span class=\"nn\">std<\/span><span class=\"p\">::<\/span><span class=\"nn\">io<\/span><span class=\"p\">::<\/span><span class=\"n\">Error<\/span><span class=\"p\">),<\/span>\r\n  <span class=\"nf\">CannotOpenFile<\/span><span class=\"p\">(<\/span><span class=\"n\">path<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">),<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>2. \u30a8\u30e9\u30fc\u30c1\u30a7\u30fc\u30f3\u3092\u7a4d\u3081\u308b<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">use<\/span> <span class=\"nn\">std<\/span><span class=\"p\">::<\/span><span class=\"nn\">fs<\/span><span class=\"p\">::<\/span><span class=\"n\">File<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">use<\/span> <span class=\"nn\">errors<\/span><span class=\"p\">::{<\/span><span class=\"n\">MyError<\/span><span class=\"p\">,<\/span> <span class=\"n\">MyErrorKind<\/span><span class=\"p\">,<\/span> <span class=\"n\">MyResultExt<\/span><span class=\"p\">};<\/span>\r\n<span class=\"nd\">try!<\/span><span class=\"p\">(<\/span><span class=\"nn\">File<\/span><span class=\"p\">::<\/span><span class=\"nf\">open<\/span><span class=\"p\">(<\/span><span class=\"s\">\"foo.txt\"<\/span><span class=\"p\">)<\/span>\r\n  <span class=\"nf\">.map_err<\/span><span class=\"p\">(<\/span><span class=\"nn\">MyErrorKind<\/span><span class=\"p\">::<\/span><span class=\"n\">Io<\/span><span class=\"p\">)<\/span>\r\n  <span class=\"nf\">.chain_err<\/span><span class=\"p\">(||<\/span> <span class=\"s\">\"\u30d5\u30a1\u30a4\u30eb\u958b\u3051\u3078\u3093\u3084\u3093\u3051\"<\/span><span class=\"p\">));<\/span>\r\n  <span class=\"nf\">.chain_err<\/span><span class=\"p\">(||<\/span> <span class=\"nn\">MyErrorKind<\/span><span class=\"p\">::<\/span><span class=\"nf\">CannotOpenFile<\/span><span class=\"p\">(<\/span><span class=\"s\">\"foo.txt\"<\/span><span class=\"py\">.to_string<\/span><span class=\"p\">)));<\/span>\r\n<span class=\"c\">\/\/ CannotOpenFile -&gt; Msg -&gt; Io -&gt; std::io::Error<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>3. MyError::iter \u3067\u539f\u56e0\u3092\u30a4\u30c6\u30ec\u30fc\u30c8\u3067\u304d\u308b<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">for<\/span> <span class=\"n\">err<\/span> <span class=\"n\">in<\/span> <span class=\"n\">err<\/span><span class=\"nf\">.iter<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nd\">println!<\/span><span class=\"p\">(<\/span><span class=\"s\">\"{}\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>4. MyError::backtrace \u3067\u30d0\u30c3\u30af\u30c8\u30ec\u30fc\u30b9\u304c\u3068\u308c\u308b<\/h3>\n<pre class=\"post-pre\"><code><span class=\"c\">\/\/ need RUST_BACKTRACE=1<\/span>\r\n<span class=\"k\">if<\/span> <span class=\"k\">let<\/span> <span class=\"nf\">Some<\/span><span class=\"p\">(<\/span><span class=\"n\">trace<\/span><span class=\"p\">)<\/span> <span class=\"o\">=<\/span> <span class=\"n\">err<\/span><span class=\"nf\">.backtrace<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"c\">\/\/ io::Error \u3067\u306f\u306a\u304f MyError \u304c\u4f5c\u3089\u308c\u305f\u6642\u70b9\u306e\u30c8\u30ec\u30fc\u30b9\u304c\u5f97\u3089\u308c\u308b<\/span>\r\n  <span class=\"nd\">println!<\/span><span class=\"p\">(<\/span><span class=\"s\">\"{:?}\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">trace<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h2>error-chain \u306e\u554f\u984c\u70b9<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">derive macro \u306a\u3093\u3066\u306a\u304b\u3063\u305f<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u751f\u6210\u3055\u308c\u308b\u30b3\u30fc\u30c9\u304c \u81a8\u5927<\/ul>\n<\/li>\n<\/ul>\n<p>\u521d\u898b\u6bba\u3057<br \/>\n\u751f\u6210\u3055\u308c\u308b MyError \u304c !Sync \u3067\u4f7f\u3044\u52dd\u624b\u304c\u60aa\u3044<\/p>\n<hr \/>\n<h2>\u7d50\u8ad6: error-chain \u306f\u904e\u53bb\u306e\u907a\u7523<\/h2>\n<hr \/>\n<h2>\u3058\u3083\u3042 failure \u3092\u4f7f\u3048\u3070\u3044\u3044\u306e\u304b\uff1f<\/h2>\n<hr \/>\n<h1>failure \u306b\u3064\u3044\u3066<\/h1>\n<hr \/>\n<h2>failure \u30af\u30ec\u30fc\u30c8<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">2017 \u5e74 11 \u6708\u306b\u767b\u5834<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u554f\u984c\u3060\u3089\u3051\u306e Error \u30c8\u30ec\u30a4\u30c8\u3092\u7f6e\u304d\u63db\u3048\u308b\u305f\u3081\u306b\u958b\u767a\u3055\u308c\u305f<\/ul>\n<\/li>\n<\/ul>\n<p>Error \u30c8\u30ec\u30a4\u30c8\u306e\u4ee3\u308f\u308a\u306b Fail \u30c8\u30ec\u30a4\u30c8\u3092\u5c0e\u5165<\/p>\n<p>Box \u306e\u4ee3\u308f\u308a\u306b failure::Error \u69cb\u9020\u4f53\u3092\u5c0e\u5165<\/p>\n<hr \/>\n<h3>derive \u3067\u304d\u308b<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nd\">#[derive(Debug,<\/span> <span class=\"nd\">Fail)]<\/span>\r\n<span class=\"k\">pub<\/span> <span class=\"k\">enum<\/span> <span class=\"n\">MyError<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nd\">#[fail(display<\/span> <span class=\"nd\">=<\/span> <span class=\"s\">\"Input was invalid UTF-8 at index {}\"<\/span><span class=\"nd\">,<\/span> <span class=\"mi\">_0<\/span><span class=\"nd\">)]<\/span>\r\n  <span class=\"nf\">Utf8Error<\/span><span class=\"p\">(<\/span><span class=\"nb\">usize<\/span><span class=\"p\">),<\/span>\r\n  <span class=\"nd\">#[fail(display<\/span> <span class=\"nd\">=<\/span> <span class=\"s\">\"IoError: {}\"<\/span><span class=\"nd\">,<\/span> <span class=\"mi\">_0<\/span><span class=\"nd\">)]<\/span>\r\n  <span class=\"nf\">Io<\/span><span class=\"p\">(<\/span><span class=\"nd\">#[cause]<\/span> <span class=\"nn\">io<\/span><span class=\"p\">::<\/span><span class=\"n\">Error<\/span><span class=\"p\">),<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>cause chain \u304c\u30a4\u30c6\u30e9\u30d6\u30eb<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">impl<\/span> <span class=\"n\">Fail<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">pub<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">iter_causes<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">Causes<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n  <span class=\"o\">...<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>backtrace \u304c\u53d6\u308c\u308b<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">pub<\/span> <span class=\"k\">trait<\/span> <span class=\"n\">Fail<\/span><span class=\"p\">:<\/span> <span class=\"n\">Display<\/span> <span class=\"o\">+<\/span> <span class=\"n\">Debug<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Send<\/span> <span class=\"o\">+<\/span> <span class=\"n\">Sync<\/span> <span class=\"o\">+<\/span> <span class=\"nv\">'static<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">fn<\/span> <span class=\"nf\">backtrace<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;&amp;<\/span><span class=\"n\">Backtrace<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n  <span class=\"o\">...<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>Fail \u306b Send + Sync + &#8216;static \u304c\u3064\u3044\u3066\u308b<\/h3>\n<p>tokio \u3067\u3082\u4f7f\u3048\u308b<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">pub<\/span> <span class=\"k\">trait<\/span> <span class=\"n\">Fail<\/span><span class=\"p\">:<\/span> <span class=\"n\">Display<\/span> <span class=\"o\">+<\/span> <span class=\"n\">Debug<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Send<\/span> <span class=\"o\">+<\/span> <span class=\"n\">Sync<\/span> <span class=\"o\">+<\/span> <span class=\"nv\">'static<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"o\">...<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>\u30c0\u30a6\u30f3\u30ad\u30e3\u30b9\u30c8\u3067\u304d\u308b<\/h3>\n<p>Fail \u306b &#8216;static \u304c\u3064\u3044\u3066\u308b\u306e\u3067<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">pub<\/span> <span class=\"k\">trait<\/span> <span class=\"n\">Fail<\/span><span class=\"p\">:<\/span> <span class=\"n\">Display<\/span> <span class=\"o\">+<\/span> <span class=\"n\">Debug<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Send<\/span> <span class=\"o\">+<\/span> <span class=\"n\">Sync<\/span> <span class=\"o\">+<\/span> <span class=\"nv\">'static<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"o\">...<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">impl<\/span> <span class=\"n\">Fail<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">pub<\/span> <span class=\"k\">fn<\/span> <span class=\"n\">downcast_ref<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">:<\/span> <span class=\"n\">Fail<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;&amp;<\/span><span class=\"n\">T<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n  <span class=\"k\">pub<\/span> <span class=\"k\">fn<\/span> <span class=\"n\">downcast_mut<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">:<\/span> <span class=\"n\">Fail<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">mut<\/span> <span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;&amp;<\/span><span class=\"k\">mut<\/span> <span class=\"n\">T<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span> <span class=\"o\">...<\/span> <span class=\"p\">}<\/span>\r\n  <span class=\"o\">...<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h3>cause chain \u3092\u7a4d\u3081\u308b<\/h3>\n<pre class=\"post-pre\"><code><span class=\"n\">err<\/span>\r\n <span class=\"nf\">.context<\/span><span class=\"p\">(<\/span><span class=\"nd\">format_err!<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Error code: \u306a\u3093\u304b\u30a8\u30e9\u30fc\u304a\u304d\u305f}\"<\/span><span class=\"p\">))<\/span>\r\n <span class=\"nf\">.context<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\u306a\u3093\u304b\u30a8\u30e9\u30fc\u304a\u304d\u305f\"<\/span><span class=\"nf\">.to_string<\/span><span class=\"p\">());<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h2>\u7d50\u8ad6: failure \u306f\u3059\u3054\u304f\u3044\u3044\u304c\u2026\u2026<\/h2>\n<hr \/>\n<h1>RFC 2504, &#8220;Fix the Error trait&#8221;<\/h1>\n<hr \/>\n<h2>\u65b0\u3057\u3044 Error \u30c8\u30ec\u30a4\u30c8<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">failure \u304b\u3089\u534a\u5e74\u5f8c\u306e 2018 \u5e74 7 \u6708\u306b\u63d0\u6848\u3001\u30008 \u6708\u306b\u30de\u30fc\u30b8<\/ul>\n<\/li>\n<\/ul>\n<p>failure \u306e\u77e5\u898b\u3092\u53d6\u308a\u8fbc\u3093\u3060\u6539\u5584<\/p>\n<hr \/>\n<h2>\u65b0\u3057\u3044 Error \u30c8\u30ec\u30a4\u30c8<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">backtrace \u3067\u304d\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u30c0\u30a6\u30f3\u30ad\u30e3\u30b9\u30c8\u3067\u304d\u308b<\/ul>\n<pre class=\"post-pre\"><code><span class=\"k\">trait<\/span> <span class=\"n\">Error<\/span><span class=\"p\">:<\/span> <span class=\"n\">Display<\/span> <span class=\"o\">+<\/span> <span class=\"n\">Debug<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">fn<\/span> <span class=\"nf\">backtrace<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;&amp;<\/span><span class=\"n\">Backtrace<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">fn<\/span> <span class=\"nf\">source<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;&amp;<\/span><span class=\"n\">dyn<\/span> <span class=\"n\">Error<\/span> <span class=\"o\">+<\/span> <span class=\"nv\">'static<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h2>\u65b0\u3057\u3044 Error \u30c8\u30ec\u30a4\u30c8<\/h2>\n<p>\u4ee5\u524d\u306e\u30e1\u30bd\u30c3\u30c9\u304c\u3072\u3068\u3064\u3082\u6b8b\u3063\u3066\u306a\u3044<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">trait<\/span> <span class=\"n\">Error<\/span><span class=\"p\">:<\/span> <span class=\"n\">Display<\/span> <span class=\"o\">+<\/span> <span class=\"n\">Debug<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">fn<\/span> <span class=\"nf\">backtrace<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;&amp;<\/span><span class=\"n\">Backtrace<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">fn<\/span> <span class=\"nf\">source<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;&amp;<\/span><span class=\"n\">dyn<\/span> <span class=\"n\">Error<\/span> <span class=\"o\">+<\/span> <span class=\"nv\">'static<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h2>\u672a\u89e3\u6c7a\u306e\u554f\u984c<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Backtrace \u306e\u5177\u4f53\u7684\u306a API \u304c\u672a\u5b9a<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30a4\u30c6\u30e9\u30d6\u30eb\u306a cause chain \u306e API \u304c\u672a\u5b9a<\/ul>\n<\/li>\n<\/ul>\n<p>derive(Error) \u3067\u304d\u306a\u3044<\/p>\n<hr \/>\n<h2>2019\u5e746\u6708\u73fe\u5728<\/h2>\n<hr \/>\n<h3>error-chain \u306f\u958b\u767a\u505c\u6b62<\/h3>\n<hr \/>\n<h3>failure \u306f\u51cd\u7d50<\/h3>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30e1\u30b8\u30e3\u30fc\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u306f\u306f\u5b9f\u88c5\u304c\u843d\u3061\u7740\u304f\u307e\u3067\u505c\u6b62\u4e2d (\u307e\u308b\u3067 futures-0.1 \u306e\u3088\u3046\uff1f)<\/ul>\n<\/li>\n<\/ul>\n<p>Fail -\u306fErrorExt \u306b\u3057\u3066\u65b0 Error \u30c8\u30ec\u30a4\u30c8\u3092\u7d99\u627f\u3059\u308b\u304b\u3082<\/p>\n<p>failure::Error \u306ffailure::DefaultError \u306b\u306a\u308b\u304b\u3082<\/p>\n<hr \/>\n<h3>\u30dd\u30b9\u30c8 failure \u304c\u5897\u6b96\u4e2d<\/h3>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">err-derive<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">SNAFU<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">errer<\/ul>\n<p>\u306a\u3069\u306a\u3069<\/p>\n<hr \/>\n<h1>\u304a\u308f\u308a<\/h1>\n<hr \/>\n<h1>Appendix. Rust \u306e\u30a8\u30e9\u30fc\u307e\u308f\u308a\u306e\u6b74\u53f2<\/h1>\n<h2>2014<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">2014-05-24 &#8211; Error handling in Rust is actually pretty awesome. &#8211; https:\/\/news.ycombinator.com\/item?id=7792438<\/ul>\n<\/li>\n<\/ul>\n<p>2014-08-16 &#8211; RFC: error interoperation #201 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/201<\/p>\n<p>2014-08-16 &#8211; 0.0.0 &#8211; https:\/\/github.com\/reem\/rust-error\/<\/p>\n<p>2014-08-30 &#8211; RFC: Error conventions #220 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/220<\/p>\n<p>2014-09-17 &#8211; First-class error handling with ? and catch #243 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/243<\/p>\n<p>2014-10-13 &#8211; RFC: Anonymous enum types called joins, as A | B #402 &#8211; https:\/\/www.reddit.com\/r\/rust\/comments\/2j1k4h\/how_do_i_handle_causes_with_generic_error_handling\/<\/p>\n<p>2014-10-16 &#8211; On Error Handling in Rust &#8211; http:\/\/lucumr.pocoo.org\/2014\/10\/16\/on-error-handling\/<\/p>\n<p>2014-10-16 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/402<\/p>\n<p>2014-10-30 &#8211; RFC: Error conventions, take 3 #236 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/236<\/p>\n<p>2014-10-31 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/blob\/master\/text\/0236-error-conventions.md<\/p>\n<p>2014-11-06 &#8211; http:\/\/lucumr.pocoo.org\/2014\/11\/6\/error-handling-in-rust\/<\/p>\n<p>2014-11-21 &#8211; Error Handling &#8211; https:\/\/doc.rust-lang.org\/1.0.0\/book\/error-handling.html &#8211; https:\/\/github.com\/rust-lang\/book<\/p>\n<p>2014-12-11 &#8211; Anonymous enum types (A|B) take 2 #514 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/514<\/p>\n<h2>2015<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">2015-01-29 &#8211; Extensible enums #757 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/757<\/ul>\n<\/li>\n<\/ul>\n<p>2015-04-07 &#8211; Consider changing io::Error to use Arc so it can implement Clone #24135 &#8211; https:\/\/github.com\/rust-lang\/rust\/issues\/24135<\/p>\n<p>2015-04-11 &#8211; Add Sync to the bounds in io::Error #24133 &#8211; https:\/\/github.com\/rust-lang\/rust\/pull\/24133<\/p>\n<p>2015-04-12 &#8211; RFC for adding Sync to io::Error #1057 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/1057<\/p>\n<p>2015-05-13 &#8211; Quick draft &#8220;Result::expect&#8221; rfc #1119 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/1119<\/p>\n<p>2015-05-14 &#8211; Error Handling in Rust &#8211; https:\/\/blog.burntsushi.net\/rust-error-handling\/<\/p>\n<p>2015-06-02 &#8211; Error handling in Rust &#8211; https:\/\/xania.org\/201506\/rust-errors<\/p>\n<p>2015-07-24 &#8211; RFC: Stabilize catch_panic #1236 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/1236<\/p>\n<p>2015-08-16 &#8211; 0.1.1 &#8211; https:\/\/crates.io\/crates\/enum_derive<\/p>\n<p>2015-08-29 &#8211; RFC : Try-Catch Blocks &#8211; https:\/\/users.rust-lang.org\/t\/rfc-try-catch-blocks\/2663<\/p>\n<p>2015-09-10 &#8211; 0.1.0 &#8211; https:\/\/github.com\/tailhook\/quick-error<\/p>\n<p>2015-09-13 &#8211; Compare enums only by variant, not value &#8211; https:\/\/stackoverflow.com\/questions\/32554285\/compare-enums-only-by-variant-not-value<\/p>\n<p>2015-10-08 &#8211; Allow a custom panic handler #1328 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/1328<\/p>\n<p>2015-11-02 &#8211; RUST AND GO (ERROR HANDLING) &#8211; http:\/\/tyoverby.com\/posts\/rust-vs-go.html<\/p>\n<p>2015-12-02 &#8211; String, From and Box interoperation could be better. #30156 &#8211; https:\/\/github.com\/rust-lang\/rust\/issues\/30156<\/p>\n<h2>2016<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">2016-01-08 &#8211; Announcing error-chain, a library for consistent and reliable Rust error handling &#8211; https:\/\/users.rust-lang.org\/t\/announcing-error-chain-a-library-for-consistent-and-reliable-rust-error-handling\/6133<\/ul>\n<\/li>\n<\/ul>\n<p>2016-03-29 &#8211; Error Handling in Rust &#8211; https:\/\/facility9.com\/2016\/03\/error-handling-in-rust\/<\/p>\n<p>2016-03-24 &#8211; 0.1.0 &#8211; https:\/\/crates.io\/crates\/simple-error<\/p>\n<p>2016-04-13 &#8211; 0.2.0 &#8211; https:\/\/github.com\/rust-lang\/backtrace-rs<\/p>\n<p>2016-04-29 &#8211; 0.1.8- https:\/\/crates.io\/crates\/error-chain<\/p>\n<p>2016-05-18 &#8211; Adding Context to Rust Errors &#8211; https:\/\/medium.com\/@paulcolomiets\/adding-context-to-rust-errors-3c6f58a7074b<\/p>\n<p>2016-05-27 &#8211; Rust 1.9 improves speed, error handling &#8211; https:\/\/www.infoworld.com\/article\/3075321\/rust-19-improves-speed-error-handling.html<\/p>\n<p>2016-06-08 &#8211; Why I\u2019m dropping Rust &#8211; https:\/\/users.rust-lang.org\/t\/announcing-error-chain-a-library-for-consistent-and-reliable-rust-error-handling\/6133<\/p>\n<p>2016-07-16 &#8211; Can\u2019t to introspect error cause &#8211; https:\/\/users.rust-lang.org\/t\/cant-to-introspect-error-cause\/6536<\/p>\n<p>2016-07-21 &#8211; Elegant Library APIs in Rust &#8211; https:\/\/deterministic.space\/elegant-apis-in-rust.html<\/p>\n<p>2016-07-22 &#8211; Rust &#8211; Custom Error Types | rust Tutorial &#8211; RIP Tutorial &#8211; https:\/\/riptutorial.com\/rust\/example\/6788\/custom-error-types<\/p>\n<p>2016-08-01 &#8211; Add a compile_error! macro to libstd #1695 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/1695<\/p>\n<p>2016-08-03 &#8211; Helping with the Rust Errors &#8211; https:\/\/www.jonathanturner.org\/2016\/08\/helping-out-with-rust-errors.html<\/p>\n<p>2016-08-14 &#8211; Problems getting error description in Rust &#8211; https:\/\/stackoverflow.com\/questions\/38936996\/problems-getting-error-description-in-rust<\/p>\n<p>2016-08-24 &#8211; Error causes can&#8217;t be downcast #35943 &#8211; https:\/\/github.com\/rust-lang\/rust\/issues\/35943<\/p>\n<p>2016-09-11 &#8211; The Error Model &#8211; http:\/\/joeduffyblog.com\/2016\/02\/07\/the-error-model\/<\/p>\n<p>2016-10-24 &#8211; Accumulating Results in Rust With Validated &#8211; https:\/\/beachape.com\/blog\/2016\/10\/24\/accumulating-results-in-rust-with-validated\/<\/p>\n<p>2016-10-27 &#8211; Rewinding time with rr &amp; Rust to debug a terrible error message &#8211; https:\/\/blog.faraday.io\/reversing-rust-debugging-a-terrible-error-message-backwards-in-time-with-rr-2\/<\/p>\n<p>2016-11-20 &#8211; Error-chain 0.6.0 &#8211; https:\/\/users.rust-lang.org\/t\/error-chain-0-6-0\/8079\/2<\/p>\n<p>2016-11-21 &#8211; 0.2.0 &#8211; https:\/\/crates.io\/crates\/macro_attr<\/p>\n<p>2016-11-30 &#8211; Starting a new Rust project right, with error-chain &#8211; https:\/\/brson.github.io\/2016\/11\/30\/starting-with-error-chain<\/p>\n<p>2016-12-01 &#8211; Starting a new Rust project right, with error-chain &#8211; https:\/\/www.reddit.com\/r\/rust\/comments\/5ftgv5\/starting_a_new_rust_project_right_with_errorchain\/<\/p>\n<p>2016-12-15 &#8211; Stroustrup&#8217;s Rule and Layering Over Time &#8211; https:\/\/thefeedbackloop.xyz\/stroustrups-rule-and-layering-over-time\/ &#8211; https:\/\/news.ycombinator.com\/item?id=13192052<\/p>\n<p>2016-12-18 &#8211; 24 days of Rust &#8211; error_chain &#8211; https:\/\/siciarz.net\/24-days-rust-error_chain\/<\/p>\n<h2>2017<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">2017-01-16 &#8211; 0.0.0 &#8211; https:\/\/crates.io\/crates\/derive-error<\/ul>\n<\/li>\n<\/ul>\n<p>2017-01-20 &#8211; RFC 1859: Try\u30c8\u30ec\u30a4\u30c8 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/1859 &#8211; https:\/\/gist.github.com\/sile\/7b967511f9d922ecfab80dc27d17d82d<\/p>\n<p>2017-02-06 &#8211; Custom Error types in Rust and the ? operator &#8211; https:\/\/medium.com\/@fredrikanderzon\/custom-error-types-in-rust-and-the-operator-b499d0fb2925<\/p>\n<p>2017-02-11 &#8211; A way to customize Rust error messages &#8211; https:\/\/deterministic.space\/hook-into-rustc-errors.html<\/p>\n<p>2017-02-15 &#8211; Nice error handling in Rust &#8211; https:\/\/www.reddit.com\/r\/rust\/comments\/5u0vkk\/nice_error_handling_in_rust\/<\/p>\n<p>2017-02-22 &#8211; RFC: ? in main #1937 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/1937<\/p>\n<p>2017-03-03 &#8211; How do you define custom Error types in Rust? &#8211; https:\/\/stackoverflow.com\/questions\/42584368\/how-do-you-define-custom-error-types-in-rust\/42584607#42584607<\/p>\n<p>2017-03-13 &#8211; Rust\u3067\u30a8\u30e9\u30fc\u3092\u5408\u6210\u3059\u308b &#8211; https:\/\/qiita.com\/termoshtt\/items\/8c015d9289613ec640f1\/revisions<\/p>\n<p>2017-03-22 &#8211; Error Handling &#8211; https:\/\/stevedonovan.github.io\/rust-gentle-intro\/6-error-handling.html<\/p>\n<p>2017-04-02 &#8211; Pre RFC ish: Bring ensure! macro from error-chain into std? &#8211; https:\/\/users.rust-lang.org\/t\/pre-rfc-ish-bring-ensure-macro-from-error-chain-into-std\/10181<\/p>\n<p>2017-05-06 &#8211; Error types &#8211; as enums or as structs &#8211; https:\/\/users.rust-lang.org\/t\/error-types-as-enums-or-as-structs\/9797\/3<\/p>\n<p>2017-05-24 &#8211; Future-proofing enums\/structs with #[non_exhaustive] attribute #2008 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/2008<\/p>\n<p>2017-06-03 &#8211; Rust\u306etry-catch\u69cb\u6587 &#8211; https:\/\/qnighy.hatenablog.com\/entry\/2017\/06\/03\/070000<\/p>\n<p>2017-06-06 &#8211; Refactor error types #936 &#8211; https:\/\/github.com\/diesel-rs\/diesel\/issues\/936<\/p>\n<p>2017-07-18 &#8211; Tracking issue for RFC 1937: ? in main #43301 &#8211; https:\/\/github.com\/rust-lang\/rust\/issues\/43301<\/p>\n<p>2017-08-27 &#8211; Tracking issue for RFC 2008: Future-proofing enums\/structs with #[non_exhaustive] attribute #44109 &#8211; https:\/\/github.com\/rust-lang\/rust\/issues\/44109<\/p>\n<p>2017-09-17 &#8211; Rust \u3067\u30a8\u30e9\u30fc\u578b\u306b Clone \u304c\u5b9f\u88c5\u3055\u308c\u3066\u3044\u3066\u307b\u3057\u3044 &#8211; https:\/\/blog.cardina1.red\/2017\/09\/15\/rust-clonable-error-types\/<\/p>\n<p>2017-10-26 &#8211; Improve errors and error handling #460 &#8211; https:\/\/github.com\/amethyst\/amethyst\/issues\/460<\/p>\n<p>2017-11-03 &#8211; Rust futures: an uneducated, short and hopefully not boring tutorial &#8211; Part 2 &#8211; https:\/\/dev.to\/mindflavor\/rust-futures-an-uneducated-short-and-hopefully-not-boring-tutorial&#8212;part-2-8dd<\/p>\n<p>2017-11-04 &#8211; Improving error matching consistency (at least for testing) &#8211; https:\/\/github.com\/rust-lang-nursery\/failure\/issues\/14<\/p>\n<p>2017-11-16 &#8211; Announcing Failure &#8211; https:\/\/boats.gitlab.io\/blog\/post\/2017-11-16-announcing-failure\/<\/p>\n<p>2017-11-17 &#8211; Announcing Failure &#8211; https:\/\/www.reddit.com\/r\/rust\/comments\/7dg95u\/announcing_failure\/<\/p>\n<p>2017-11-20 &#8211; Rust\u306e\u300eRFC 2113: dyn\u30c8\u30ec\u30a4\u30c8\u69cb\u6587\u300f\u306e\u8981\u7d04\u30e1\u30e2 &#8211; https:\/\/gist.github.com\/sile\/0615a6daa1f5576d63c8775cc5a94f88<\/p>\n<p>2017-11-24 &#8211; Consider examples for &#8220;failure&#8221; crate? #370 &#8211; https:\/\/github.com\/rust-lang-nursery\/rust-cookbook\/issues\/370<\/p>\n<p>2017-11-30 &#8211; Failure 0.1.1 released &#8211; https:\/\/boats.gitlab.io\/blog\/post\/2017-11-30-failure-0-1-1\/<\/p>\n<p>2017-11-30 &#8211; Bury Error::description() #2230 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/2230<\/p>\n<p>2017-12-03 &#8211; error-chain and failure &#8211; https:\/\/amp.reddit.com\/r\/rust\/comments\/7h8v1z\/errorchain_and_failure\/<\/p>\n<h2>2018<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">2018-01-06 &#8211; https:\/\/mobile.twitter.com\/qnighy\/status\/949648140759572480<\/ul>\n<\/li>\n<\/ul>\n<p>2018-01-22 &#8211; Dyn Trait &amp; #[derive(Debug, Fail)] &#8211; https:\/\/users.rust-lang.org\/t\/dyn-trait-derive-debug-fail\/18250<\/p>\n<p>2018-02-03 &#8211; Any plans for clonable errors? #148 &#8211; https:\/\/github.com\/rust-lang-nursery\/failure\/issues\/148<\/p>\n<p>2018-02-18 &#8211; Rust\u306e\u30d1\u30cb\u30c3\u30af\u6a5f\u69cb &#8211; https:\/\/qnighy.hatenablog.com\/entry\/2018\/02\/18\/223000<\/p>\n<p>2018-02-22 &#8211; Failure 1.0.0 on March 15 &#8211; https:\/\/boats.gitlab.io\/blog\/post\/2018-02-22-failure-1.0\/<\/p>\n<p>2018-03-02 &#8211; Rust\u306e\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0 &#8211; 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<\/p>\n<p>2018-03-08 &#8211; error-chain deprecation #181 &#8211; https:\/\/github.com\/rust-lang-nursery\/failure\/issues\/181<\/p>\n<p>2018-03-09 &#8211; Redefining Failure &#8211; https:\/\/epage.github.io\/blog\/2018\/03\/redefining-failure\/<\/p>\n<p>2018-04-04 &#8211; Migrate application from error-chain to failure &#8211; https:\/\/users.rust-lang.org\/t\/migrate-application-from-error-chain-to-failure\/16601<\/p>\n<p>2018-04-04 &#8211; RFC: Reserve try for try { .. } block expressions #2388 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/2388<\/p>\n<p>2018-04-29 &#8211; https:\/\/cat-in-136.github.io\/2018\/04\/rust-error-handling-question.html<\/p>\n<p>2018-05-03 &#8211; &#8220;TL;DR &#8211; 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.&#8221; &#8211; https:\/\/github.com\/rust-lang\/rust\/issues\/43301#issuecomment-388575730<\/p>\n<p>2018-05-26 &#8211; Maintainership of failure #209 &#8211; https:\/\/github.com\/rust-lang-nursery\/failure\/issues\/209<\/p>\n<p>2018-06-30 &#8211; rust \u306e\u30a8\u30e9\u30fc\u30e9\u30a4\u30d6\u30e9\u30ea\u306f failure \u3092\u4f7f\u3048\uff01 &#8211; https:\/\/qiita.com\/legokichi\/items\/d76b6aa5dac2ad781bda<\/p>\n<p>2018-07-19 &#8211; Fix the Error trait #2504 &#8211; https:\/\/github.com\/rust-lang\/rfcs\/pull\/2504<\/p>\n<p>https:\/\/boats.gitlab.io\/failure\/error-msg.html<\/p>\n<p>2018-07-22 &#8211; https:\/\/mobile.twitter.com\/qnighy\/status\/1021021205166297090<\/p>\n<p>2018-08-14 &#8211; Custom error guidelines? &#8211; https:\/\/users.rust-lang.org\/t\/custom-error-guidelines\/19547<\/p>\n<p>2018-08-19 &#8211; Tracking issue for RFC 2504, &#8220;Fix the Error trait&#8221; #53487 &#8211; https:\/\/github.com\/rust-lang\/rust\/issues\/53487<\/p>\n<p>2018-10-08 &#8211; Current state of error handling in Rust? https:\/\/www.reddit.com\/r\/rust\/comments\/9m5w9a\/current_state_of_error_handling_in_rust\/<\/p>\n<p>2018-11-02 &#8211; 1.0.0 &#8211; https:\/\/crates.io\/crates\/custom_error<\/p>\n<p>2018-11-21 &#8211; impl Error for String &#8211; https:\/\/internals.rust-lang.org\/t\/impl-error-for-string\/8881<\/p>\n<p>2018-12-02 &#8211; Rust ergonomics for error handling #23 &#8211; https:\/\/github.com\/awslabs\/aws-lambda-rust-runtime\/issues\/23<\/p>\n<p>2018-12-04 &#8211; Rust\u306e\u30a8\u30e9\u30fc\u51e6\u7406 &#8211; https:\/\/qiita.com\/fujitayy\/items\/cafe661415b6aa33d884<\/p>\n<p>2018-12-05 &#8211; on error handling #502 &#8211; https:\/\/github.com\/rust-lang-nursery\/rust-cookbook\/issues\/502<\/p>\n<p>2018-12-05 &#8211; Introduce amethyst_error #1220 &#8211; https:\/\/github.com\/amethyst\/amethyst\/pull\/1220<\/p>\n<p>2018-12-15 &#8211; The state of error handling in the 2018 edition &#8211; https:\/\/users.rust-lang.org\/t\/the-state-of-error-handling-in-the-2018-edition\/23263<\/p>\n<p>2018-12-18 &#8211; Announcing err-derive &#8211; yet another error handling library &#8211; https:\/\/users.rust-lang.org\/t\/announcing-err-derive-yet-another-error-handling-library\/23594<\/p>\n<p>2018-12-18 &#8211; [RFC] Error handling in Rust runtime #54 &#8211; https:\/\/github.com\/awslabs\/aws-lambda-rust-runtime\/issues\/54<\/p>\n<p>2018-12-18 &#8211; [RFC] Runtime crates refactor #53 &#8211; https:\/\/github.com\/awslabs\/aws-lambda-rust-runtime\/issues\/53<\/p>\n<p>2018-12-19 &#8211; Fail-rs 0.2.1 released &#8211; https:\/\/users.rust-lang.org\/t\/fail-rs-0-2-1-released\/23355<\/p>\n<p>2018-12-30 &#8211; Towards 0.2 and Beyond #287 &#8211; https:\/\/github.com\/rust-lang-nursery\/failure\/issues\/287<\/p>\n<h2>2019<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">2019-01-07 &#8211; How to port error_chain to 2018? &#8211; https:\/\/users.rust-lang.org\/t\/how-to-port-error-chain-to-2018\/23960<\/ul>\n<\/li>\n<\/ul>\n<p>2019-01-13 &#8211; Best practice to return a Result&lt;_, impl Error&gt; and not a Result&lt;_, &amp;str&gt; in Rust? &#8211; https:\/\/stackoverflow.com\/questions\/54159232\/best-practice-to-return-a-result-impl-error-and-not-a-result-str-in-rus<\/p>\n<p>2019-01-15 &#8211; The Evolution of a Rust Programmer &#8211; http:\/\/antoyo.ml\/evolution-rust-programmer<\/p>\n<p>2019-01-19 &#8211; 0.1.0 &#8211; https:\/\/crates.io\/crates\/errer<\/p>\n<p>2019-01-20 &#8211; Rust\u3067trait\u306eassociated type\u306b\u5bfe\u3057\u3066trait boundary\u3092\u8ab2\u3059 &#8211; https:\/\/in-neuro.hatenablog.com\/entry\/2019\/01\/20\/210653<\/p>\n<p>2019-01-21 &#8211; 0.1.0 &#8211; https:\/\/crates.io\/crates\/easy-error<\/p>\n<p>2019-01-28 &#8211; 0.1.0 &#8211; https:\/\/crates.io\/crates\/snafu<\/p>\n<p>2019-02-09 &#8211; Custom Exit Status Codes with ? in main &#8211; https:\/\/www.joshmcguigan.com\/blog\/custom-exit-status-codes-rust\/<\/p>\n<p>2019-02-17 &#8211; Tracking issue for error source iterators #58520 &#8211; https:\/\/github.com\/rust-lang\/rust\/issues\/58520<\/p>\n<p>2019-03-01 &#8211; Rust: failure\u3092\u7528\u3044\u305f\u30a8\u30e9\u30fc\u578b\u5b9a\u7fa9 &#8211; https:\/\/qiita.com\/OvQ\/items\/cb866c04196dc59fe847<\/p>\n<p>2019-03-02 &#8211; std: implement Error for Box #58859 &#8211; https:\/\/github.com\/rust-lang\/rust\/pull\/58859<\/p>\n<p>2019-03-11 &#8211; RFC 2504 &#8220;fix_error&#8221;: Rust\u306e\u65b0\u305f\u306aError\u30c8\u30ec\u30a4\u30c8 &#8211; https:\/\/qiita.com\/termoshtt\/items\/830008898f90c647a971<\/p>\n<p>2019-03-22 &#8211; On error handling &#8211; https:\/\/users.rust-lang.org\/t\/on-error-handling\/26515<\/p>\n<p>2019-03-27 &#8211; 0.1.1 &#8211; https:\/\/crates.io\/crates\/error-rules<\/p>\n<p>2019-04-02 &#8211; Review and address feedback #46 &#8211; https:\/\/github.com\/shepmaster\/snafu\/issues\/46#issuecomment-486482005<\/p>\n<p>2019-04-09 &#8211; rust-lang\/rustlings\/exercises\/error_handling\/ &#8211; https:\/\/github.com\/rust-lang\/rustlings\/tree\/d7e58ee1af3945dc2b13f2ebb9daa7c2b2a26175\/exercises\/error_handling<\/p>\n<p>2019-04-15 &#8211; SNAFU 0.2.1 Released &#8211; https:\/\/users.rust-lang.org\/t\/snafu-0-2-1-released\/27269<\/p>\n<p>2019-04-19 &#8211; removed error-chain from examples having only one error variant #525 &#8211; https:\/\/github.com\/rust-lang-nursery\/rust-cookbook\/pull\/525<\/p>\n<p>2019-04-24 &#8211; Error-chain is no longer maintained &#8211; https:\/\/users.rust-lang.org\/t\/error-chain-is-no-longer-maintained\/27561<\/p>\n<p>2019-04-25 &#8211; Failing to port from error-chain to std error handling &#8211; https:\/\/users.rust-lang.org\/t\/failing-to-port-from-error-chain-to-std-error-handling\/27611<\/p>\n<p>2018-04-25 &#8211; Any experiences with snafu? &#8211; https:\/\/www.reddit.com\/r\/rust\/comments\/bgy80y\/any_experiences_with_snafu\/<\/p>\n<p>2019-04-26 &#8211; Today, I would probably not use any error handling helper library for a library. &#8211; https:\/\/users.rust-lang.org\/t\/error-chain-is-no-longer-maintained\/27561\/8<\/p>\n<p>2019-04-29 &#8211; Rust\u2019s 2019 roadmap &#8211; https:\/\/www.reddit.com\/r\/rust\/comments\/bgikmz\/rusts_2019_roadmap\/eln8h8y\/<\/p>\n<p>2019-05-13 &#8211; Security advisory for the standard library -https:\/\/blog.rust-lang.org\/2019\/05\/13\/Security-advisory.html<\/p>\n<p>2019-05-21 &#8211; Returning errors: -&gt; Result&lt;(), Box&gt; https:\/\/www.reddit.com\/r\/rust\/comments\/br2gut\/returning_errors_result_boxerrorerror\/<\/p>\n<p>2019-05-22 &#8211; https:\/\/twitter.com\/wx257osn2\/status\/1131255087379013632<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Rust LT #6 \u3067\u767a\u8868\u3057\u305f\u30b9\u30e9\u30a4\u30c9 Error \u30c8\u30ec\u30a4\u30c8\u306b\u3064\u3044\u3066 std::error::Error \u30c8 [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-44961","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>- Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/44961-2\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:description\" content=\"Rust LT #6 \u3067\u767a\u8868\u3057\u305f\u30b9\u30e9\u30a4\u30c9 Error \u30c8\u30ec\u30a4\u30c8\u306b\u3064\u3044\u3066 std::error::Error \u30c8 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/44961-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-05T01:05:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T02:03:16+00:00\" \/>\n<meta name=\"author\" content=\"\u9038, \u79d1\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u9038, \u79d1\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/44961-2\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/44961-2\/\",\"name\":\"- Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2022-11-05T01:05:50+00:00\",\"dateModified\":\"2024-04-29T02:03:16+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/44961-2\/\"]}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\",\"name\":\"\u9038, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"caption\":\"\u9038, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/44961-2\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"- Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/44961-2\/","og_locale":"zh_CN","og_type":"article","og_description":"Rust LT #6 \u3067\u767a\u8868\u3057\u305f\u30b9\u30e9\u30a4\u30c9 Error \u30c8\u30ec\u30a4\u30c8\u306b\u3064\u3044\u3066 std::error::Error \u30c8 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/44961-2\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2022-11-05T01:05:50+00:00","article_modified_time":"2024-04-29T02:03:16+00:00","author":"\u9038, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u9038, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"15 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/44961-2\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/44961-2\/","name":"- Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2022-11-05T01:05:50+00:00","dateModified":"2024-04-29T02:03:16+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/44961-2\/"]}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487","name":"\u9038, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","caption":"\u9038, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/44961-2\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/44961","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=44961"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/44961\/revisions"}],"predecessor-version":[{"id":84609,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/44961\/revisions\/84609"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=44961"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=44961"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=44961"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}