C.W.K.
Stream
Lesson 01 of 05 · published

panic! — 복구 불가 에러

~10 min · errors, panic, unwrap, expect

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

Rust 는 실패를 둘로 나누고, 그 구분이 모든 걸 빚어: 프로그램을 멈춰야 하는 복구 불가 에러랑, 호출자가 다룰 수 있는 복구 가능 에러. 이 레슨은 첫 번째: panic!.

프로그램이 그냥 멈춰야 할 때

panic! 은 '뭔가 너무 잘못돼서 계속하는 게 무의미해' 라는 뜻이야. 스택을 풀고, 소멸자를 돌리고, 스레드를 중단해. 절대 일어나면 안 되는 버그에 손 뻗어 — 위반된 불변식, 수학적으로 범위 안이 보장된 인덱스, '이 경우는 진짜 불가능' 가지에.

unwrap 과 expect

Option 이나 Result.unwrap()None/Err 면 panic 해. .expect("메시지") 는 같은데 네 메시지를 panic 에 담아 — 엄격히 더 나아, 메시지가 미래의 너한테 왜 실패할 리 없다고 확신했는지 말해주니까. 둘 다 변장한 panic 이야: 실패가 예상된 조건이 아니라 진짜 버그를 뜻할 때 써.

panic 은 버그용이지 예상된 실패용이 아니야. 사용자가 안 만들었을 수도 있는 없는 파일은 복구 가능 에러야 — Result 를 반환해. 네 코드가 지켰어야 할 위반된 불변식은 버그 야 — panic 하고 코드를 고쳐. 둘을 헷갈리면 프로덕션 크래시나 에러 처리 연극 중 하나를 얻어.

panic 은 예외가 아니야

panic! 을 throw-and-catch 메커니즘으로 쓰지 마. 푸는 panic 을 잡을 수는 있지만, 제어 흐름이 아니라 진짜 복구 불가 상황용이야. 복구 가능 에러는 Result 값으로 흐르고, 이 트랙 나머지가 그거에 관한 거야.

Code

expect, 인덱스 panic, 의도적 panic!·rust
fn main() {
    let config = vec!["width=80", "height=24"];

    // expect: 불변식이 깨지면 이유와 함께 panic
    let first = config.first().expect("config must not be empty");
    println!("{first}");

    // config[99]; // panic — 끝 너머 인덱싱은 버그

    // 진짜 불가능한 경우에 대한 의도적이고 문서화된 panic:
    let kind = "square";
    let sides = match kind {
        "triangle" => 3,
        "square" => 4,
        other => panic!("unknown shape: {other}"),
    };
    println!("{sides}");
}

External links

Exercise

슬라이스를 받아 의미 있는 메시지의 .expect("...") 로 첫 원소를 반환하는 함수를 써봐. 데이터로 한 번, 빈 슬라이스로 한 번 불러 panic 메시지를 봐. 그다음 정해: 이 함수는 대신 Option 을 반환했어야 할까? 각 선택이 언제 맞아?
Hint
빈 슬라이스가 예상된 유효 입력이면 Option 을 반환하고 호출자가 None 을 다루게 해. 빈 슬라이스가 상류 버그를 뜻하면 expect 가 그 가정을 문서화하고 시끄럽게 크래시해. 도메인이 정해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.