Always had the problem that if I wanted to just log an error, rather than bubble it all the way up to main(), that you wouldn’t get a stacktrace. You could iterate the source chain and plug the stacktrace together yourself, but it’s rather complex code.
Now I realized, you can do this to get a stacktrace:
let error = todo!("Get an error somehow...");
let error = anyhow::anyhow!(error); //converts to an `anyhow::Error`
eprintln!("Error with stacktrace: {error:?}");
For converting to an anyhow::Error, it often also makes sense to use anyhow::Context like so:
use anyhow::Context;
let error = error.context("Deleting file failed.");


Other useful
Debugimplementations:PathBufandPathwill give you the path with quotes and I believe, it escapes any non-UTF8 characters.std::time::Durationwill give you reasonably formatted output, likeDuration::from_millis(54321)will format as54.321s, whereasDuration::from_millis(321)will format as321ms. Not appropriate for every situation, but works pretty well for logging.