# Selective Error Handling What about functions returning different Error types? In this example `func1()` can return either `Func1ErrorFunc2` or `Func1ErrorIO`. We might want to `match` on `func1()` with something like: ~~~rust,ignore fn main() -> Result<(), Box> { match func1() { Err(e) if let Some(s) = e.downcast_chain_ref::() => eprintln!("Func1ErrorIO:\n{:?}", s), Err(e) if let Some(s) = e.downcast_chain_ref::() => eprintln!("Func1ErrorFunc2:\n{:?}", s), Ok(_) => {}, } Ok(()) } ~~~ but this is not valid rust code, so we end up doing it the hard way. In the next chapter, we will see, how to solve this more elegantly. ~~~rust {{#include ../examples/tutorial9.rs}} # #[allow(dead_code)] # mod chainerror { {{#rustdoc_include ../src/lib.rs:-1}} # } ~~~