Структуры, перечисления и трейты
Rust Error Handling: Result and ?
Errors are values in Rust. Return Result, handle it with match, and pass errors on with ?.
Что вы узнаете
- Ok and Err
- The ? operator
- Your own error messages
parse_and_double("abc")
- 1
text.parse()fails - 2
?returns early - 3
Err(...)the caller gets the error
Success or error, as a value
Rust has no exceptions. A function that can fail returns Result<T, E>, which is either Ok(value) or Err(error). The caller decides what to do with the error.
The ? after parse returns the error to the caller at once when parsing fails; otherwise it gives the number. divide uses a String as its error type and returns Err for a zero divisor. match prints the value or the error message.
Главное
- Result<T, E> is
Ok(value)orErr(error). - ? returns the error to the caller at once.
- The caller decides what to do.
Пример на Rust, который можно запустить
Rust
main.rs
use std::num::ParseIntError;
fn parse_and_double(text: &str) -> Result<i32, ParseIntError> {
let number: i32 = text.trim().parse()?; // ? returns the error early
Ok(number * 2)
}
fn divide(a: i32, b: i32) -> Result<i32, String> {
if b == 0 {
return Err(String::from("cannot divide by zero"));
}
Ok(a / b)
}
fn main() {
for input in ["21", "abc"] {
match parse_and_double(input) {
Ok(value) => println!("{input} -> {value}"),
Err(error) => println!("{input} -> error: {error}"),
}
}
println!("{:?}", divide(10, 2));
println!("{:?}", divide(1, 0));
}
21 -> 42
abc -> error: invalid digit found in string
Ok(5)
Err("cannot divide by zero")Практика
Откройте пример в онлайн-компиляторе, измените значение или добавьте строку и попробуйте предсказать вывод до запуска. Затем намеренно сломайте код и прочитайте сообщение компилятора.
Закончили этот урок?
Отметьте его как изученный, чтобы следить за прогрессом.
Ваш прогресс сохранён в этом браузере Войдите, чтобы он был доступен на всех устройствах.
Попрактикуйтесь на задаче
Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.
- Первый неверный возраст Проверяйте введённые возраста и сообщайте, где находится первая неверная запись, вместо того чтобы позволять программе аварийно завершаться. Легко
- Сумма корректных чисел Сложите элементы, которые являются целыми числами, и пропустите всё остальное, как try/except обрабатывает неверный ввод. Легко