Как я могу распространять ошибки в Rust? - PullRequest
0 голосов
/ 24 января 2019

Есть ли хороший способ распространять ошибки в Rust? Например, я хотел бы провести рефакторинг следующего кода, чтобы избежать вложенных ошибок:

.for_each(|record| {
    match f1() {
        Ok(a1) => match f2() {
            Ok(a2) => match f3() {
                Ok(_) => {}
                Err(e) => {
                    eprintln!("Error: {}", e);
                }
            },
            Err(e) => {
                eprintln!("Error: {}", e);
            }
        },
        Err(e) => {
            eprintln!("Error: {}", e);
        }
    };
    Ok(())
})

Вопрос не является дубликатом, потому что у меня есть оператор for_each, который усложняет мне ситуацию. И когда я ставлю ? на f2, я фактически получаю следующую ошибку:

the trait `std::convert::From<std::io::Error>` is not implemented for `grpcio::error::Error`

1 Ответ

0 голосов
/ 24 января 2019

Вы можете связать свои функции в сценарии успеха с помощью and_then и отобразить их ошибки с помощью map_err.

Как здесь, вы можете связать их:

let result = f1().and_then(|_| {
    f2().and_then(|_| {
        f3().and_then(|_| {
            println!("All functions are succeed");
            Ok(())
        })
    })
});

Здесь вы будетеиметь переменную result, если возникает ошибка.

Тогда вы можете сопоставить эту ошибку с оператором if let Err(error) следующим образом:

if let Err(error) = result {
    println!("Problem occurred: {:?}", error);
};

Существует также возможность выбросить вашу ошибку в верхнююуровни с макросом try! или оператором ?, как показано ниже:

fn throw_error() -> Result<String, MyError> {
    let string_val = "will not be returned".to_string();

    Err(MyError::thrownError)?;
    Ok(string_val)
}

Здесь вы можете протестировать и поиграть немного больше, чтобы понять концепции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...