Rust:
Обработка ошибок

Как это сделать:

В Rust существуют два основных способа обработки ошибок: восстанавливаемые и невосстанавливаемые ошибки. Давайте рассмотрим оба.

Восстанавливаемые ошибки используют Result<T, E>:

use std::fs::File;

fn open_file(filename: &str) -> Result<File, std::io::Error> {
    let f = File::open(filename);
    
    match f {
        Ok(file) => Ok(file),
        Err(e) => Err(e),
    }
}

fn main() {
    match open_file("hello.txt") {
        Ok(_file) => println!("Файл успешно открыт."),
        Err(_e) => println!("Не удалось открыть файл."),
    }
}

Вывод может быть либо “Файл успешно открыт.”, либо “Не удалось открыть файл.”, в зависимости от вашего файла hello.txt.

Для обработки невосстанавливаемых ошибок используем panic!:

fn main() {
    // Это вызовет панику программы, поскольку файл, скорее всего, не существует.
    let _f = File::open("nowhere.txt").unwrap();
}

Запустите, и вы увидите сообщение о панике. Ваша программа останавливается намертво.

Углубленно

Исторически обработка ошибок в программировании была сложной задачей. Rust справляется с этим правильно, четко разделяя восстанавливаемые и невосстанавливаемые ошибки.

Перечисление Result используется для восстанавливаемых ошибок. Оно явное – вы обрабатываете варианты Ok или Err. Есть также методы, например, unwrap() и expect(), но это быстрые и грязные сокращения, которые могут приводить к panic!.

panic! — это способ Rust сообщить, что произошло что-то действительно плохое, и он не может с этим справиться. Это как невосстанавливаемая ошибка, которая немедленно останавливает выполнение. Паника в Rust часто связана с багами, с которыми вы не ожидаете справиться, например, выход за границы массива.

Обработка ошибок с возвращением Result предпочтительна, когда вы ожидаете иметь дело с ошибками. Это идиоматичный Rust, что означает, что это способ, на который разработчики Rust договорились делать вещи. Есть также Option<T> для случаев, когда ошибка просто заключается в том, что что-то является None вместо Some(T). Все это о ожидании неожиданного без страха.

Альтернативы? Конечно, вы можете использовать другие пакеты для обработки ошибок для дополнительных функций или более удобного использования. Например, anyhow для простой обработки ошибок или thiserror для ошибок в коде библиотеки.

Смотрите также

Хотите углубиться? Вот куда стоит обратиться:

Помните, хорошая обработка ошибок - это не просто кодирование; это забота о пользователях вашего кода. Счастливого кодирования!