Tôi đang đọc tài liệu vềFile
:
//..
let mut file = File::create("foo.txt")?;
//..
Dòng này là ?
gì? Tôi không nhớ đã nhìn thấy nó trong Sách Gỉ trước đây.
Tôi đang đọc tài liệu vềFile
:
//..
let mut file = File::create("foo.txt")?;
//..
Dòng này là ?
gì? Tôi không nhớ đã nhìn thấy nó trong Sách Gỉ trước đây.
Câu trả lời:
Như bạn có thể nhận thấy, Rust không có ngoại lệ. Nó gây hoảng loạn, nhưng chức năng của chúng bị hạn chế (chúng không thể mang thông tin có cấu trúc) và việc sử dụng chúng để xử lý lỗi không được khuyến khích (chúng dành cho các lỗi không thể khôi phục).
Trong Rust, xử lý lỗi sử dụng Result
. Một ví dụ điển hình sẽ là:
fn halves_if_even(i: i32) -> Result<i32, Error> {
if i % 2 == 0 {
Ok(i / 2)
} else {
Err(/* something */)
}
}
fn do_the_thing(i: i32) -> Result<i32, Error> {
let i = match halves_if_even(i) {
Ok(i) => i,
Err(e) => return Err(e),
};
// use `i`
}
Điều này thật tuyệt vì:
Tuy nhiên, nó ít lý tưởng hơn ở chỗ nó rất dài dòng. Đây là lúc toán tử dấu hỏi ?
đi vào.
Phần trên có thể được viết lại thành:
fn do_the_thing(i: i32) -> Result<i32, Error> {
let i = halves_if_even(i)?;
// use `i`
}
ngắn gọn hơn nhiều.
Điều gì ?
ở đây tương đương với match
câu lệnh trên. Tóm lại: nó giải nén Result
nếu OK và trả về lỗi nếu không.
Nó hơi kỳ diệu một chút, nhưng việc xử lý lỗi cần một số phép thuật để cắt bớt bảng soạn sẵn, và không giống như các trường hợp ngoại lệ, nó có thể nhìn thấy ngay lập tức lệnh gọi hàm nào có thể xảy ra hoặc không thể xảy ra lỗi: những lệnh được tô điểm bằng ?
.
Một ví dụ về điều kỳ diệu là điều này cũng hoạt động cho Option
:
// Assume
// fn halves_if_even(i: i32) -> Option<i32>
fn do_the_thing(i: i32) -> Option<i32> {
let i = halves_if_even(i)?;
// use `i`
}
Điều này được hỗ trợ bởi Try
đặc điểm (không ổn định) .
Xem thêm:
Result
hoặc Option
.
Nó dùng để truyền lỗi cho loại lỗi có thể khôi phục được. Kết quả <T, E>. Nó mở ra kết quả và cung cấp cho bạn giá trị bên trong.
Thay vì xử lý trường hợp lỗi, bạn truyền nó tới mã người gọi và chỉ xử lý trường hợp Ok. Lợi ích là, nó loại bỏ rất nhiều bảng soạn sẵn và làm cho việc thực hiện chức năng đơn giản hơn.
.unwrap()
mà hoảng sợ trong trường hợp có lỗi.