{"componentChunkName":"component---src-templates-post-template-js","path":"/rust-thiserror-en","result":{"data":{"markdownRemark":{"id":"ecc7bc4f-8520-595a-8077-61a2dfd3aa19","html":"<blockquote>\n<p>This page has been machine-translated from the <a href=\"/rust-thiserror\">original page</a>.</p>\n</blockquote>\n<p>This time, I will briefly summarize what Rust’s <code class=\"language-text\">thiserror</code> crate is and how to use it.</p>\n<p>Reference: <a href=\"https://docs.rs/thiserror/latest/thiserror/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">thiserror - Rust</a></p>\n<!-- omit in toc -->\n<h2 id=\"table-of-contents\" style=\"position:relative;\"><a href=\"#table-of-contents\" aria-label=\"table of contents permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Table of Contents</h2>\n<ul>\n<li><a href=\"#what-is-the-thiserror-crate\">What Is the thiserror Crate?</a></li>\n<li><a href=\"#error-handling-in-rust\">Error Handling in Rust</a></li>\n<li><a href=\"#using-thiserror-for-error-handling\">Using thiserror for Error Handling</a></li>\n<li><a href=\"#minimal-example-using-thiserror\">Minimal Example Using thiserror</a></li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n<h2 id=\"what-is-the-thiserror-crate\" style=\"position:relative;\"><a href=\"#what-is-the-thiserror-crate\" aria-label=\"what is the thiserror crate permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What Is the thiserror Crate?</h2>\n<p><code class=\"language-text\">thiserror</code> is a crate (a library in Rust) for concisely implementing the Rust <code class=\"language-text\">std::error::Error</code> trait (which defines common methods across different types) with derive macros (which automatically generate trait implementation code for structs and enums).</p>\n<p><code class=\"language-text\">anyhow</code> is another useful crate for error handling in Rust, but compared with <code class=\"language-text\">anyhow</code>, <code class=\"language-text\">thiserror</code> has advantages when implementing custom error types. It is commonly used in libraries where error types need to be explicitly exposed so callers can distinguish them.</p>\n<p>Reference: <a href=\"https://qiita.com/Aqua-218/items/6dbb5b9fd4f431598e37\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">thiserror vs anyhow, the error-handling holy war #Rust - Qiita</a></p>\n<h2 id=\"error-handling-in-rust\" style=\"position:relative;\"><a href=\"#error-handling-in-rust\" aria-label=\"error handling in rust permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Error Handling in Rust</h2>\n<p>To begin with, Rust does not have try-catch style error handling, and errors are represented with the <code class=\"language-text\">Result&lt;T, E></code> type.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">enum</span> <span class=\"token type-definition class-name\">Result</span><span class=\"token operator\">&lt;</span><span class=\"token class-name\">T</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">E</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">T</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>   <span class=\"token comment\">// Value on success</span>\n    <span class=\"token class-name\">Err</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">E</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>  <span class=\"token comment\">// Value on error</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Reference: <a href=\"https://zenn.dev/0x/articles/5591cb490cebe5\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Rust Is Great: Error Handling Edition</a></p>\n<p>In Rust, the <code class=\"language-text\">Result</code> type is used as the result of operations that may fail.</p>\n<p>The following function is a straightforward implementation of error handling when using the <code class=\"language-text\">read_to_string</code> function.</p>\n<p>Rust can use pattern matching with <code class=\"language-text\">match</code> like this to perform error handling based on the <code class=\"language-text\">Result</code> return value.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">use</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span></span>fs<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token class-name\">Result</span><span class=\"token operator\">&lt;</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span>io<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">Error</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> content <span class=\"token operator\">=</span> <span class=\"token keyword\">match</span> <span class=\"token namespace\">fs<span class=\"token punctuation\">::</span></span><span class=\"token function\">read_to_string</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"test.txt\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> text<span class=\"token punctuation\">,</span>\n        <span class=\"token class-name\">Err</span><span class=\"token punctuation\">(</span>err<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">return</span> <span class=\"token class-name\">Err</span><span class=\"token punctuation\">(</span>err<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"{}\"</span><span class=\"token punctuation\">,</span> content<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Reference: <a href=\"https://doc.rust-lang.org/rust-by-example/flow_control/match.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">match - Rust By Example</a></p>\n<p>In Rust, using the <code class=\"language-text\">?</code> operator lets you write nearly the same <code class=\"language-text\">Result</code> handling as the <code class=\"language-text\">match</code> expression above, as shown below.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">use</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span></span>fs<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token class-name\">Result</span><span class=\"token operator\">&lt;</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span>io<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">Error</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> content <span class=\"token operator\">=</span> <span class=\"token namespace\">fs<span class=\"token punctuation\">::</span></span><span class=\"token function\">read_to_string</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"test.txt\"</span><span class=\"token punctuation\">)</span><span class=\"token operator\">?</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"{}\"</span><span class=\"token punctuation\">,</span> content<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Reference: <a href=\"https://doc.rust-jp.rs/book-ja/ch09-02-recoverable-errors-with-result.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Recoverable Errors with Result - The Rust Programming Language (Japanese Edition)</a></p>\n<p>Reference: <a href=\"https://qiita.com/kanna/items/a0c10a0563573d5b2ed0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Rust’s ? Operator #Rust - Qiita</a></p>\n<p>Also, similar processing can be implemented like this.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">use</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span></span>fs<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token class-name\">Result</span><span class=\"token operator\">&lt;</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Box</span><span class=\"token operator\">&lt;</span><span class=\"token keyword\">dyn</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span>error<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">Error</span><span class=\"token operator\">>></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> message<span class=\"token punctuation\">:</span> <span class=\"token class-name\">String</span> <span class=\"token operator\">=</span> <span class=\"token namespace\">fs<span class=\"token punctuation\">::</span></span><span class=\"token function\">read_to_string</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"message.txt\"</span><span class=\"token punctuation\">)</span><span class=\"token operator\">?</span><span class=\"token punctuation\">;</span>\n    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"{}\"</span><span class=\"token punctuation\">,</span> message<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>In the code above, errors are handled using <code class=\"language-text\">Box&lt;dyn std::error::Error></code>.</p>\n<p>Rust requires a function’s return type to be clear at compile time, but here <code class=\"language-text\">dyn std::error::Error</code> dynamically dispatches some type that implements the <code class=\"language-text\">std::error::Error</code> trait.</p>\n<p>In such cases, <code class=\"language-text\">Box</code> is used to point to data stored on the heap.</p>\n<p>This makes it possible to use a type even when its size cannot be determined at compile time, and it also lets you receive errors even when different error types may be returned inside the function, as shown below.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">use</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span></span>fs<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token class-name\">Result</span><span class=\"token operator\">&lt;</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Box</span><span class=\"token operator\">&lt;</span><span class=\"token keyword\">dyn</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span>error<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">Error</span><span class=\"token operator\">>></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// io::Error is automatically converted to Box&lt;dyn Error> by ?</span>\n    <span class=\"token comment\">// let content = fs::read_to_string(\"Cargo.toml\")?;</span>\n    <span class=\"token keyword\">let</span> content <span class=\"token operator\">=</span> <span class=\"token namespace\">fs<span class=\"token punctuation\">::</span></span><span class=\"token function\">read_to_string</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"xxx.toml\"</span><span class=\"token punctuation\">)</span><span class=\"token operator\">?</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// ParseIntError can also be converted to the same Box&lt;dyn Error></span>\n    <span class=\"token keyword\">let</span> port<span class=\"token punctuation\">:</span> <span class=\"token keyword\">u16</span> <span class=\"token operator\">=</span> content<span class=\"token punctuation\">.</span><span class=\"token function\">trim</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">parse</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">?</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"port = {}\"</span><span class=\"token punctuation\">,</span> port<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Reference: <a href=\"https://doc.rust-jp.rs/rust-by-example-ja/trait/dyn.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Returning Traits with dyn - Rust By Example (Japanese Edition)</a></p>\n<p>Reference: <a href=\"https://doc.rust-jp.rs/book-ja/ch15-01-box.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Using Box<T> to Point to Heap Data - The Rust Programming Language (Japanese Edition)</a></p>\n<h2 id=\"using-thiserror-for-error-handling\" style=\"position:relative;\"><a href=\"#using-thiserror-for-error-handling\" aria-label=\"using thiserror for error handling permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Using thiserror for Error Handling</h2>\n<p>When the caller handles errors, using <code class=\"language-text\">Box&lt;dyn std::error::Error></code> makes it easy to handle multiple types, but it also has drawbacks, such as making it harder for the caller to determine the error kind.</p>\n<p><code class=\"language-text\">thiserror</code> makes it easy to implement explicit custom error types, so it is mainly used in library implementations that need to expose error types structurally and allow callers to pattern match on them.</p>\n<h2 id=\"minimal-example-using-thiserror\" style=\"position:relative;\"><a href=\"#minimal-example-using-thiserror\" aria-label=\"minimal example using thiserror permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Minimal Example Using thiserror</h2>\n<p>Below is a simple error-handling implementation using <code class=\"language-text\">thiserror</code>. Here, an enum defines an error called <code class=\"language-text\">AppError</code>.</p>\n<p>The leading <code class=\"language-text\">#[derive(Debug, Error)]</code> is used to automatically implement the <code class=\"language-text\">std::error::Error</code> trait.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">use</span> <span class=\"token namespace\">thiserror<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">Error</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token attribute attr-name\">#[derive(Debug, Error)]</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">enum</span> <span class=\"token type-definition class-name\">AppError</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token attribute attr-name\">#[error(<span class=\"token string\">\"I/O エラー: {0}\"</span>)]</span>\n    <span class=\"token class-name\">Io</span><span class=\"token punctuation\">(</span><span class=\"token attribute attr-name\">#[from]</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span>io<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">Error</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">handle_error</span><span class=\"token punctuation\">(</span>err<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token class-name\">AppError</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">match</span> err <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">AppError</span><span class=\"token punctuation\">::</span><span class=\"token class-name\">Io</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            <span class=\"token macro property\">eprintln!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"[IO] ファイル操作失敗: {}\"</span><span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">read_config</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token keyword\">str</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token class-name\">Result</span><span class=\"token operator\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">AppError</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> content <span class=\"token operator\">=</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span>fs<span class=\"token punctuation\">::</span></span><span class=\"token function\">read_to_string</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">)</span><span class=\"token operator\">?</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span>content<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"--- 1. 存在しないファイルの読み込み (#[from] による自動変換) ---\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">match</span> <span class=\"token function\">read_config</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"nonexistent.toml\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span>content<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"{}\"</span><span class=\"token punctuation\">,</span> content<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token class-name\">Err</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">handle_error</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\n--- 2. 存在するファイルの読み込み (#[from] による自動変換) ---\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">match</span> <span class=\"token function\">read_config</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Cargo.toml\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span>content<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"{}\"</span><span class=\"token punctuation\">,</span> content<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token class-name\">Err</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">handle_error</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>In the code above, <code class=\"language-text\">#[from]</code> automatically generates the implementation that converts <code class=\"language-text\">std::io::Error</code> into <code class=\"language-text\">AppError</code>, and when errors are propagated with the <code class=\"language-text\">?</code> operator, conversion from <code class=\"language-text\">io::Error</code> to <code class=\"language-text\">AppError</code> is performed automatically.</p>\n<h2 id=\"summary\" style=\"position:relative;\"><a href=\"#summary\" aria-label=\"summary permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Summary</h2>\n<p>I may add more implementation patterns that use <code class=\"language-text\">thiserror</code> later.</p>","fields":{"slug":"/rust-thiserror-en","tagSlugs":["/tag/rust-en/","/tag/english/"]},"frontmatter":{"date":"2026-05-23","description":"Notes on Rust error handling and the thiserror crate.","tags":["Rust (en)","English"],"title":"Notes on Rust Error Handling and thiserror","socialImage":{"publicURL":"/static/25f109c28784e3626b8123a90088ff95/rust-thiserror.png"}}}},"pageContext":{"slug":"/rust-thiserror-en"}},"staticQueryHashes":["251939775","401334301","825871152"]}