Blog2026-09-075 min read

Lập trình Rust Cơ Bản: Làm Chủ Error Handling với Result & Option

Lập trình Rust Cơ Bản: Làm Chủ Error Handling với Result & Option

Nguyen Pham
Xin chào. Mình thích lập trình và công nghệ. Đây là blog mình chia sẻ lại các kiến thức về lập trình, công nghệ.

Trong lập trình Rust ngày càng phổ biến, việc error handling (xử lý lỗi) là một trong những kỹ năng quan trọng nhất mà mọi lập trình viên Rust cần nắm vững. Bài viết này sẽ dẫn bạn qua các khái niệm ResultOption – hai công cụ mạnh mẽ giúp bạn viết code Rust an toànđáng tin cậy.

Giới thiệu nhanh về Result và Option#

Rust không có exception như một số ngôn ngữ khác. Thay vào đó, nó sử dụng các enum ResultOption để biểu diễn các trạng thái có thể thất bại hoặc không có giá trị. Điều này giúp:

  • Phát hiện lỗi tại thời gian biên dịch.
  • Buộc người lập trình phải xử lý mọi trường hợp.
  • Giữ cho chương trình luôn an toànđáng tin cậy.

1. Enum Option – Khi giá trị có thể không tồn tại#

Option có hai biến thể: Some(T)None. Đây là cách Rust biểu diễn “có hoặc không có” một giá trị.

Cú pháp cơ bản#

code
let maybe_number: Option<i32> = Some(42);
let absent: Option<String> = None;

Ví dụ thực tế#

Giả sử bạn đang đọc một phần tử từ một vector:

code
let numbers = vec![10, 20, 30];
let third = numbers.get(2); // trả về Option<i32>
match third {
    Some(value) => println!("Số thứ 3 là {}", value),
    None => println!("Không có phần tử thứ 3"),
}

2. Enum Result – Khi một hành động có thể thất bại#

Result có hai biến thể: Ok(T) cho kết quả thành công và Err(E) cho lỗi.

Cú pháp cơ bản#

code
use std::fs::File;

fn open_file(path: &str) -> Result<File, std::io::Error> {
    File::open(path)
}

Quản lý lỗi bằng match#

code
match open_file("data.txt") {
    Ok(file) => println!("Mở file thành công: {:?}", file),
    Err(e) => eprintln!("Không thể mở file: {}", e),
}

Sử dụng ? operator#

Để viết code ngắn gọn hơn, Rust cung cấp ? operator, tự động trả về Err nếu có lỗi.

code
fn read_to_string(path: &str) -> Result<String, std::io::Error> {
    let mut file = File::open(path)?;
    let mut content = String::new();
    file.read_to_string(&mut content)?;
    Ok(content)
}

3. Khi nào dùng Option và khi nào dùng Result?#

  • Option: Khi một giá trị có thể “không tồn tại” nhưng không phải là lỗi nghiêm trọng (ví dụ: tìm kiếm trong danh sách).
  • Result: Khi một thao tác có thể thất bại và cần cung cấp thông tin chi tiết về lỗi (ví dụ: I/O, parsing, network).

4. Các phương pháp “chuyển đổi” giữa Option và Result#

Rust cung cấp các hàm tiện ích giúp chuyển đổi dễ dàng:

  • Option::ok_or(err) – chuyển Option thành Result.
  • Result::ok() – lấy Some từ Ok hoặc None nếu là Err.
  • Result::err() – ngược lại.

5. Mẹo tối ưu khi làm việc với Result & Option#

  • Sử dụng unwrap_orunwrap_or_else để cung cấp giá trị mặc định hoặc logic tính toán khi None/Err.
  • Kết hợp map, and_then (hay flat_map) để thực hiện chuỗi thao tác mà không cần viết match lặp đi lặp lại.
  • Document lỗi: Khi trả về Result, luôn ghi chú E là loại lỗi nào (ví dụ: std::io::Error, ParseIntError).

Kết luận#

Việc làm chủ error handling trong lập trình Rust không chỉ giúp bạn viết code sạch hơn mà còn nâng cao độ tin cậy của ứng dụng. Bằng cách hiểu rõ OptionResult, bạn sẽ giảm thiểu lỗi runtime và tận dụng tối đa sức mạnh của Rust.

Hãy bắt đầu thực hành ngay: tạo một dự án mới, thử các ví dụ trên, và dần dần bạn sẽ cảm nhận được sự khác biệt khi code Rust trở nên “an toàn” hơn bao giờ hết.

Muốn biết thêm? Đọc thêm các bài viết về Rust basics, Error handling in Rust và tham gia cộng đồng Rust Users Forum để trao đổi kinh nghiệm.

Tags:#Blog
Lập trình Rust Cơ Bản: Làm Chủ Error Handling với Result & Option — vdailyapp Blog