Error Handling (Rust)

Panic

  • panic! ๋งคํฌ๋กœ๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์—๋Ÿฌ๋ฅผ ์ผ์œผํ‚จ๋‹ค.
  • panic! ๋งคํฌ๋กœ๊ฐ€ ๋™์ž‘ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์€ ์‹คํŒจ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์Šคํƒ์„ ๋˜๊ฐ๋Š”๋‹ค.
fn main() {
    panic!("crash and burn");
}

Result

  • ๋Œ€๋ถ€๋ถ„์˜ ์—๋Ÿฌ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘๋‹จํ•ด์•ผ ํ•  ์ •๋„๋กœ ์‹ฌ๊ฐํ•˜์ง€๋Š” ์•Š๋‹ค.

  • ํ•จ์ˆ˜๊ฐ€ ์‹คํŒจํ•˜๋ฉด Result ์—ด๊ฑฐํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•œ๋‹ค.

    enum Result<T, E> {
        Ok(T),
        Err(E),
    }
    
  • ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•œ Result์— ๋”ฐ๋ผ ๋ถ„๊ธฐ๋ฅผ ํ•œ๋‹ค.

    let file = File::open("data");
    let file = match file {
        Ok(f) => f,
        Err(error) => {
            panic!("Failed to open the file: {:?}", error)
        },
    }
    
  • Result์—์„œ ๋ฐ˜ํ™˜ํ•œ ์—๋Ÿฌ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋‹ค์‹œ ๋ถ„๊ธฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

    let file = File::open("data");
    let file = match file {
          Ok(f) => f,
          Err(error) => match error.kind() {
              ErrorKind::NotFound => match File::create("data") {
                  Ok(fc) => fc,
                  Err(e) => panic!("Failed to create file: {:?}", e),
              },
              other_error => panic!("Failed to open file: {:?}", other_error),
          },
      };
    
  • unwrap - Result๊ฐ€ Ok๋ฉด Ok์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜, Err์ด๋ฉด panic! ๋งคํฌ๋กœ๋ฅผ ํ˜ธ์ถœ.

    let file = File::open("data").unwrap();
    
  • expect - unwrap๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ panic!์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    let file = File::open("data").expect("Failed to open file");
    
  • ? - Result๊ฐ€ Ok๋ฉด Ok์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜, Err์ด๋ฉด ํ˜ธ์ถœ๋ถ€์— Err์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (์ด๋•Œ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ Result ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.)

    fn open_file() -> Result<String, io::Error> {
        let file = File::open("data")?;
        Ok(file)
    }
    

์ด ๋ฌธ์„œ๋ฅผ ์ธ์šฉํ•œ ๋ฌธ์„œ