When handling errors, preserve the original error context and avoid exposing internal representations to users. Use `IoResultExt::context()` to attach meaningful path information to I/O errors, and maintain error source chains using `.with_source()` or similar mechanisms.
When handling errors, preserve the original error context and avoid exposing internal representations to users. Use IoResultExt::context()
to attach meaningful path information to I/O errors, and maintain error source chains using .with_source()
or similar mechanisms.
For user-facing error messages, avoid displaying internal data structures that users cannot understand. Instead, provide clear, actionable error descriptions.
Example of good error context preservation:
// Good: Attach path context to I/O errors
std::fs::write(&jj_gitignore_path, "/*\n")
.context(&jj_gitignore_path)?;
// Good: Preserve error source chain
TemplateParseError::expression(message, span).with_source(err)
// Bad: Expose internal representation to user
format!("The given revset '{:?}' was expected to have {} elements", set, count)
// Good: User-friendly message
format!("revset that was expected to have {} revision had {} revisions", expected, actual)
This approach ensures that developers get sufficient debugging information while users receive comprehensible error messages. The error context helps with troubleshooting without overwhelming end users with implementation details.
Enter the URL of a public GitHub repository