? 연산자는 Rust 에러 처리를 즐겁게 만드는 단 하나의 기능이야. 장황한 match-and-bail 패턴을 한 글자로 바꿔.
? 가 하는 일
Result (또는 Option) 뒤에 ? 를 붙여: Ok(v) 면 표현식이 v 로 평가되고 실행이 계속; Err(e) 면 함수가 그 에러와 함께 조기 반환 해. 한 연산자가 'match 하고, Err 면 Err 반환' 춤 전체를 대체해 — 한 줄에 여러 개 체이닝할 수도 있고.
에러를 자동으로 변환해
Traits 트랙으로 이어지는 마법: 전파하는 에러가 함수의 선언된 에러 타입과 다르면, ? 가 From::from 을 불러 변환해. From<LowLevelError> for MyError 를 한 번 구현하면 ? 가 저수준 에러를 네 에러 타입으로 매끄럽게 올려줘. 그게 에러 타입에 From 이 작은 수고 값을 하는 이유야.
? 는 에러에 대한 조기 반환, 공짜 변환 포함. Ok 면 unwrap 하고 계속; Err 면 반환하면서 나가는 길에 From 으로 변환. happy path 가 에러 처리 노이즈 없이 위에서 아래로 읽히고, 실패는 여전히 무시 못 해.함수가 Result 를 반환해야 해
? 는 Result (또는 Option, 또는 Try 를 구현하는 다른 타입) 를 반환하는 함수에서만 통해. 에러를 반환할 곳 이 필요하거든. main 자체가 Result<(), E> 를 반환할 수 있어서 최상위에서 바로 ? 를 쓸 수 있어.