Multiple error types
Các ví dụ trước luôn rất thuận tiện; những Result
tương tác với
những Result
, trong khi những Option
cũng tương tác với những Option
.
Đôi khi Option
lại cần tương tác với Result
, hoặc
Result<T, Error1>
cần tương tác với Result<T, Error2>
. Trong những trường hợp đó,
ta muốn quản lý các loại lỗi khác nhau sao cho những lỗi đó có thể kết hợp được với nhau và dễ dàng tương tác.
Trong đoạn code sau, 2 trường hợp gọi unwrap
trả về 2 loại lỗi khác nhau.
Vec::first
trả về Option
, trong khi parse::<i32>
trả về
Result<i32, ParseIntError>
:
fn double_first(vec: Vec<&str>) -> i32 { let first = vec.first().unwrap(); // Trả về loại lỗi 1 2 * first.parse::<i32>().unwrap() // Trả về loại lỗi 2 } fn main() { let numbers = vec!["42", "93", "18"]; let empty = vec![]; let strings = vec!["tofu", "93", "18"]; println!("The first doubled is {}", double_first(numbers)); println!("The first doubled is {}", double_first(empty)); // Loại lỗi 1: vectơ đầu vào rỗng println!("The first doubled is {}", double_first(strings)); // Loại lỗi 2: phần tử không thể chuyển đổi thành một số }
Trong các phần tiếp theo, chúng ta sẽ thấy một vài phương pháp để xử lý những vấn đề như như trên.