다음에 대한 문서를File
읽고 있습니다 .
//..
let mut file = File::create("foo.txt")?;
//..
?
이 줄 은 무엇입니까 ? 전에 Rust Book에서 본 기억이 없습니다.
다음에 대한 문서를File
읽고 있습니다 .
//..
let mut file = File::create("foo.txt")?;
//..
?
이 줄 은 무엇입니까 ? 전에 Rust Book에서 본 기억이 없습니다.
답변:
아시다시피 Rust에는 예외가 없습니다. 패닉이 있지만 기능이 제한되고 (구조화 된 정보를 전달할 수 없음) 오류 처리에 사용하지 않는 것이 좋습니다 (복구 할 수없는 오류를 의미 함).
Rust에서 오류 처리는 Result
. 일반적인 예는 다음과 같습니다.
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`
}
다음과 같은 이유로 좋습니다.
그러나 매우 장황하다는 점에서 이상적이지 않습니다. 이것은 물음표 연산자 ?
가 들어오는 곳입니다.
위의 내용은 다음과 같이 다시 작성할 수 있습니다.
fn do_the_thing(i: i32) -> Result<i32, Error> {
let i = halves_if_even(i)?;
// use `i`
}
훨씬 더 간결합니다.
어떤 ?
여기 않는 것은 동일합니다 match
위의 진술. 요컨대 : Result
OK이면 압축을 풀고 그렇지 않으면 오류를 반환 합니다.
그것은 약간의 마술이지만 오류 처리에는 상용구를 줄이기 위해 약간의 마술이 필요하며 예외와 달리 어떤 함수 호출이 오류가 발생할 수 있는지 즉시 볼 수 있습니다 ?
.
마법의 한 예는 이것이 다음에서도 작동한다는 것입니다 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`
}
이것은 (불안정한) Try
특성에 의해 구동됩니다 .
또한보십시오:
Result
또는) 과 일치해야한다고 논의합니다 Option
.