• panic! 을 사용할 때:
    • 복구 불가능한 상황이라고 판단.
  • Result 를 사용할 때:
    • 결단을 내리기 보단, 호출하는 쪽에 옵션을 제공.
    • 실패할지도 모르는 함수를 정의할 때는 Result를 반환하는 것이 기본적으로 좋다.
    • Result를 처리하는 코드가 추가되면 장황해지기 때문에, 프로토타입의 경우 unwrap, expect 등을 사용하는 것이 좋다.
    • Err 를 발생시키지 않을것이라고 확신한다면 unwrap을 사용.
      use std::net::IpAddr;
      let home = "127.0.0.1".parse::<IpAddr>().unwrap();
      
    • 사용자로 부터 IP 주소 값을 입력받는 경우라면, 외부에서 오는 데이터를 다룬다면, 에러 처리를 제대로 하는게 좋다.
    • Option이 아닌 어떤 타입을 갖고 있다면, 어떤 값을 갖고 있다고 확신할 수 있기 때문에, SomeNone 을 처리하지 않아도 된다.

값으로 검사하여 에러 방지

if guess < 1 || guess > 100 {
    // ...
    continue
}

인스턴스를 생성할 때 검사하여 에러 방지

pub struct Guess {
    value: u32,
}

impl Guess {
    pub fn new(value: u32) -> Guess {
        if value < 1 || value > 100 {
            panic!("값은 1~100 사이에 있어야 합니다: {}", value);
        }
        Guess {
            value
        }
    }
    pub fn value(&self) -> u32 {
        self.value
    }
}
  • API 문서에서 panic! 이 발생할 수 있다는 것을 표시해야 한다.
  • 위 코드에서 getter 메소드를 정의하고 있다.
  • value를 비공개로 만들어 Guess 구조체를 이용하는 코드가 value를 직접 설정하지 못하게 하고 있다.
  • value 값을 설정하기 위해서는 반드시 Guess:new 함수를 이용하여 Guess 인스턴스를 만들어야 한다. 이는 value 의 정상적인 범위를 보장한다.