# Finding an Error cause To distinguish the errors occuring in various places, we can define named string errors with the "new type" pattern. ~~~rust,ignore derive_str_context!(Func2Error); derive_str_context!(Func1Error); ~~~ Instead of `ChainError<String>` we now have `struct Func1Error(String)` and `ChainError<Func1Error>`. In the `main` function you can see, how we can match the different errors. Also see: ~~~rust,ignore if let Some(f2err) = f1err.find_chain_cause::<Func2Error>() { ~~~ as a shortcut to ~~~rust,ignore if let Some(f2err) = f1err.find_cause::<ChainError<Func2Error>>() { ~~~ hiding the `ChainError<T>` implementation detail. ~~~rust {{#include ../examples/tutorial8.rs}} # #[allow(dead_code)] # mod chainerror { {{#rustdoc_include ../src/lib.rs:-1}} # } ~~~