[Rust] 에러 처리
Updated:
개요
- 복구 불가능한(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
-