상세 컨텐츠

본문 제목

오류 처리 (Result, panic!)

Rust 예시

by 러스트코리아 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!의 동작 과정

  1. panic! 호출
  2. 현재 스레드 중단
  3. 스택 되감기(unwinding) 또는 abort
  4. 에러 메시지와 백트레이스 출력
  5. 종료 코드 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

 

반응형

'Rust 예시' 카테고리의 다른 글

러스트 기초편 3  (0) 2025.08.30
러스트 기초편 1 / 2  (0) 2025.08.30
컬렉션 (HashMap, HashSet)  (6) 2025.08.07
배열과 벡터  (0) 2025.08.04
함수 + 반환값  (0) 2025.08.03

관련글 더보기