Rust:
Xử lý lỗi

Làm thế nào:

Rust xử lý lỗi theo hai cách chính: lỗi có thể khắc phục và lỗi không thể khắc phục. Hãy xem xét cả hai.

Lỗi có thể khắc phục sử dụng 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!("Mở file thành công."),
        Err(_e) => println!("Không mở được file."),
    }
}

Kết quả có thể là “Mở file thành công.” hoặc “Không mở được file.” tùy thuộc vào file hello.txt của bạn.

Đối với lỗi không thể khắc phục, chúng ta sử dụng panic!:

fn main() {
    // Điều này sẽ gây ra sự hoảng loạn cho chương trình vì file có lẽ không tồn tại.
    let _f = File::open("nowhere.txt").unwrap();
}

Chạy nó và bạn sẽ thấy một thông điệp hoảng loạn. Chương trình của bạn dừng lại ngay lập tức.

Tìm hiểu sâu hơn

Trong lịch sử, xử lý lỗi trong lập trình đã là một hỗn loạn. Rust xử lý điều này một cách chính xác với sự phân biệt rõ ràng giữa lỗi có thể khắc phục và lỗi không thể khắc phục.

Enum Result dành cho lỗi có thể khắc phục. Nó rõ ràng - bạn xử lý biến thể Ok hoặc Err. Bạn có các phương thức như unwrap()expect() nữa, nhưng chúng là những phím tắt nhanh chóng và bẩn thỉu có thể dẫn đến panic!.

panic! là cách Rust hét lên rằng điều gì đó thực sự tồi tệ đã xảy ra, và nó không thể xử lý. Nó giống như một lỗi không thể khắc phục ngăn chặn việc thực thi ngay lập tức. Một sự hoảng loạn trong Rust thường được cảm nhận với những lỗi bạn không mong đợi phải xử lý, như chỉ số vượt ngoài giới hạn mảng.

Xử lý lỗi bằng cách trả về Result được ưa chuộng khi bạn mong đợi phải xử lý lỗi. Đó là Rust điển hình, có nghĩa là đó là cách mà các nhà phát triển Rust đã đồng ý thực hiện. Cũng có Option<T> nữa, cho các trường hợp khi một lỗi chỉ đơn giản là thứ gì đó None thay vì Some(T). Đó là việc mong đợi những điều không mong muốn mà không sợ hãi.

Có sự lựa chọn khác? Chắc chắn, bạn có thể sử dụng các crate xử lý lỗi khác cho nhiều tính năng hoặc sử dụng linh hoạt hơn. Như anyhow cho xử lý lỗi đơn giản, hoặc thiserror cho lỗi trong mã thư viện.

Xem thêm

Quan tâm đến việc tìm hiểu sâu hơn? Đây là nơi để đi:

Nhớ rằng, xử lý lỗi tốt không chỉ là viết mã; đó là quan tâm đến người dùng mã của bạn. Chúc bạn lập trình vui vẻ!