2017-03-21 17 views

Trả lời

20

Như bạn có thể thấy, Rust không có ngoại lệ. Nó có 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 có nghĩa là 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, 
     e => return e, 
    }; 

    // use `i` 
} 

này là rất tốt vì:

  • khi viết code bạn có thể không vô tình quên để đối phó với các lỗi,
  • khi đọc mã bạn ngay lập tức có thể thấy rằng có khả năng xảy ra lỗi ngay tại đây.

Ít hơn lý tưởng, tuy nhiên, nó rất tiết kiệm. Đây là nơi mà các nhà điều hành dấu hỏi ? do thỏa thuận hợp

ở trên có thể được viết lại như sau:.

fn do_the_thing(i: i32) -> Result<i32, Error> { 
    let i = halves_if_even(i)?; 

    // use `i` 
} 

mà là nhiều hơn nữa súc tích.

Điều gì ? ở đây tương đương với tuyên bố match ở trên. Tóm lại: nó mở ra Result nếu OK và trả lại lỗi nếu không.

Đó là một chút phép thuật, nhưng việc xử lý lỗi cần một số phép thuật để cắt giảm bản mẫu, và không giống như trường hợp ngoại lệ, ngay lập tức có thể nhìn thấy chức năng nào có thể hoặc không thể lỗi: những trang được trang trí ?.

Các vấn đề liên quan