Rust 예시
오류 처리 (Result, panic!)
러스트코리아
2025. 8. 7. 09:48
반응형
🔹 Result 타입
enum Result<T, E> {
Ok(T),
Err(E),
}
🔹 unwrap()과 expect()
let file = File::open("file.txt").expect("파일 열기 실패");
Rust 언어에서 panic!이란?
panic!은 “복구할 수 없는(non-recoverable) 오류”가 발생했을 때 현재 스레드를 즉시 중단하고, 스택을 정리한 뒤 프로세스를 종료시키는 매크로입니다.
-
복구 가능한 오류는 Result<T, E>로 처리하는 것이 관례이며, panic!은 버그, 논리 오류, 불변식 위반 등에 사용됩니다.
-
기본 동작은 스택 되감기(unwinding) 이지만, Cargo.toml에서 panic = 'abort'로 설정하면 바로 프로세스 abort가 됩니다.
🚨 panic!의 동작 과정
-
panic! 호출 →
-
현재 스레드 중단 →
-
스택 되감기(unwinding) 또는 abort →
-
에러 메시지와 백트레이스 출력 →
-
종료 코드 101로 프로세스 종료
✍️ 사용법 & 예제
1️⃣ 가장 단순한 예제
fn main() {
panic!("crash and burn");
}
출력 예시
thread 'main' panicked at src/main.rs:2:5:
crash and burn
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
2️⃣ format! 문법으로 메시지 구성
fn main() {
let x = 42;
panic!("expected 0, got {}", x);
}
3️⃣ 인덱스 범위 초과로 인한 암시적 panic
fn main() {
let v = vec![1, 2, 3];
let _ = v[99]; // panic: index out of bounds
}
4️⃣ 조건부 panic
fn sqrt(x: f64) -> f64 {
if x < 0.0 {
panic!("Cannot take sqrt of negative number: {}", x);
}
x.sqrt()
}
🛠️ 백트레이스 보기
터미널에서 다음과 같이 실행하면 어디서 panic이 발생했는지 추적할 수 있습니다.
$ RUST_BACKTRACE=1 cargo run
🎯 언제 panic!을 써야 할까?
| 적절한 상황 | 부적절한 상황 |
| ---------------------- | ----------------------- |
| 내부 버그나 불변식 위반 | 사용자 입력 오류 |
| 테스트/예제 코드에서 명시적 실패 표시 | 라이브러리 공개 API에서 실패 전파 |
| 초기화 실패(예: 파일이 없으면 안 됨) | 네트워크 연결 실패와 같은 복구 가능 오류 |
일반적으로 라이브러리는 Result<T, E>를 반환하고, 바이너리(main) 에서만 expect(), unwrap(), panic!을 사용하는 것이 권장됩니다
| 목적 | 복구할 수 없는 오류를 즉시 중단 |
| 기본 동작 | 스택 되감기(unwinding) |
| 대안 | Result<T, E> (복구 가능 오류) |
| 환경 변수 | RUST_BACKTRACE=1 |
| 종료 코드 | 101 |
반응형