Updated:

1 minute read

개요

  • 복구 불가능한(unrecoverable) 에러
    • panic!을 이용
    • 기본적으로 되감기(unwinding) 수행
    • 그만두기(abort)를 원할 경우 Cargo.toml 파일의 [profile] 섹션에 panic = 'abort'를 추가
  • 복구 가능한(recoverable) 에러
    • Result<T, E>를 이용
    • ?를 이용하여 에러 전파 가능
    • unwrap 메소드
      • Result 값이 Ok면 Ok 내의 값, 아니면 panic! 매크로 호출
      • let f = File::open("test.txt").unwrap();
    • expect 메소드
      • unwrap과 유사하나 패닉 메세지 제공 가능
      • let f = File::open("test.txt").expect("No such file - test.txt");


예제 1

  • 코드
    •  fn f() {
           panic!("~~~");
       }
              
       fn main() {
           f();
       }
      
  • 실행 결과 1
    • cargo run
         thread 'main' panicked at '~~~', src/main.rs:2:5
         note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
      
  • 실행 결과 2
    • RUST_BACKTRACE=1 cargo run
         thread 'main' panicked at '~~~', src/main.rs:2:5
         stack backtrace:
            0: rust_begin_unwind
            1: core::panicking::panic_fmt
            2: test1::f
                      at ./src/main.rs:2:5
            3: test1::main
                      at ./src/main.rs:6:5
            4: core::ops::function::FnOnce::call_once
                      at /builddir/build/BUILD/rustc-1.71.1-src/library/core/src/ops/function.rs:250:5
         note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
      


예제 2

  • 코드
    •  use std::fs::File;
       use std::io;
       use std::io::Read;
              
       fn read(file_name: &str) -> Result<String, io::Error> {
           let mut s = String::new();
              
           File::open(file_name)?.read_to_string(&mut s)?;
              
           Ok(s)
       }
              
       fn main() {
           println!("{}", read("invalid_name").unwrap());
       }
      
  • 실행 결과
    •  thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/main.rs:14:41
       note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace