@@ -112,6 +112,51 @@ let entries = vec![(key, value)];
112112batch . put_batch (Table :: X , entries ). expect (" msg" );
113113```
114114
115+ ### Error Handling Patterns
116+
117+ ** Use ` inspect ` and ` inspect_err ` for side-effect-only error handling:**
118+ ``` rust
119+ // ✅ GOOD: Use inspect_err when only logging or performing side effects on error
120+ result
121+ . inspect_err (| err | warn! (% err , " Operation failed" ));
122+
123+ // Extract complex expressions to variables for cleaner formatting
124+ let response = Response :: success (ResponsePayload :: BlocksByRoot (blocks ));
125+ server . swarm. behaviour_mut (). req_resp. send_response (channel , response )
126+ . inspect_err (| err | warn! (% peer , ? err , " Failed to send response" ));
127+
128+ // ✅ GOOD: Use inspect + inspect_err when both branches need side effects
129+ operation ()
130+ . inspect (| _ | metrics :: inc_success ())
131+ . inspect_err (| _ | metrics :: inc_failed ());
132+
133+ // ❌ AVOID: Using if let Err when only performing side effects
134+ if let Err (err ) = result {
135+ warn! (% err , " Operation failed" );
136+ }
137+
138+ // ❌ AVOID: Using if/else for both success and error side effects
139+ if let Err (err ) = operation () {
140+ metrics :: inc_failed ();
141+ } else {
142+ metrics :: inc_success ();
143+ }
144+ ```
145+
146+ ** When NOT to use ` inspect_err ` :**
147+ ``` rust
148+ // Use if let Err or match when:
149+ // 1. Early return needed
150+ if let Err (err ) = operation () {
151+ error! (% err , " Fatal error" );
152+ return false ;
153+ }
154+
155+ // 2. Error needs transformation (use map_err + ?)
156+ let result = operation ()
157+ . map_err (| err | CustomError :: from (err ))? ;
158+ ```
159+
115160### Metrics (RAII Pattern)
116161``` rust
117162// Timing guard automatically observes duration on drop
0 commit comments