1 분 소요

개요

  • 복구 불가능한(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