Saya membaca dokumentasi untukFile
:
//..
let mut file = File::create("foo.txt")?;
//..
Apa yang ada ?
di baris ini? Saya tidak ingat pernah melihatnya di Rust Book sebelumnya.
Saya membaca dokumentasi untukFile
:
//..
let mut file = File::create("foo.txt")?;
//..
Apa yang ada ?
di baris ini? Saya tidak ingat pernah melihatnya di Rust Book sebelumnya.
Jawaban:
Seperti yang Anda ketahui, Rust tidak memiliki pengecualian. Ada kepanikan, tetapi fungsinya terbatas (mereka tidak dapat membawa informasi terstruktur) dan penggunaannya untuk penanganan kesalahan tidak dianjurkan (dimaksudkan untuk kesalahan yang tidak dapat dipulihkan).
Di Rust, penanganan kesalahan menggunakan Result
. Contoh tipikal adalah:
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`
}
Ini bagus karena:
Ini kurang dari ideal, bagaimanapun, karena sangat bertele-tele. Di sinilah operator tanda tanya ?
masuk.
Di atas dapat ditulis ulang sebagai:
fn do_the_thing(i: i32) -> Result<i32, Error> {
let i = halves_if_even(i)?;
// use `i`
}
yang jauh lebih ringkas.
Apa yang ?
dilakukan di sini sama dengan match
pernyataan di atas. Singkatnya: ini membongkar Result
jika OK dan mengembalikan kesalahan jika tidak.
Agak ajaib, tetapi penanganan error membutuhkan sihir untuk memotong boilerplate, dan tidak seperti pengecualian, pemanggilan fungsi mana yang mungkin atau mungkin tidak error akan segera terlihat: yang dihiasi dengan ?
.
Salah satu contoh keajaiban adalah ini juga berfungsi untuk 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`
}
Ini didukung oleh sifat (tidak stabil) Try
.
Lihat juga:
Result
atau Option
.
Ini untuk penyebaran kesalahan untuk jenis kesalahan yang dapat dipulihkan. Hasil <T, E>. Ini membuka hasil dan memberi Anda nilai batin.
Daripada menangani kasus kesalahan, Anda menyebarkannya ke kode pemanggil dan hanya menangani kasus Ok. Manfaatnya, ini menghilangkan banyak boilerplate dan membuat implementasi fungsi lebih sederhana.
.unwrap()
kepanikan yang sebenarnya jika terjadi kesalahan.