# Simple String Errors

An easy way of doing error handling in rust is by returning `String` as a `Box<std::error::Error>`.

If the rust `main` function returns an `Err()`, this `Err()` will be displayed with `std::fmt::Debug`.

As you can see by running the example (by pressing the "Play" button in upper right of the code block), this only prints out the last `Error`.

    Error: "func1 error"

The next chapters of this tutorial show how `chainerror` adds more information and improves inspecting the sources of an error.

You can also run the tutorial examples in the checked out chainerror git repo.

    $ cargo run -q --example tutorial1

    use std::error::Error;
    use std::io;
    use std::result::Result;

    fn do_some_io() -> Result<(), Box<dyn Error + Send + Sync>> {
        Err(io::Error::from(io::ErrorKind::NotFound))?;
        Ok(())
    }

    fn func2() -> Result<(), Box<dyn Error + Send + Sync>> {
        if let Err(_) = do_some_io() {
            Err("func2 error")?;
        }
        Ok(())
    }

    fn func1() -> Result<(), Box<dyn Error + Send + Sync>> {
        if let Err(_) = func2() {
            Err("func1 error")?;
        }
        Ok(())
    }

    fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
        func1()
    }