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