패닉

Rust는 '패닉'으로 치명적인 오류를 처리합니다.

러스트는 수행 중 치명적인 오류를 만나면 패닉을 발생할 것입니다:

fn main() {
    let v = vec![10, 20, 30];
    println!("v[100]: {}", v[100]);
}
  • 패닉은 복구할 수 없고 예상치 못한 오류입니다.
    • 패닉은 프로그램에 버그가 있다는 것을 나타냅니다.
    • 경계 검사 실패와 같은 런타임 실패로 인해 패닉이 발생할 수 있습니다.
    • 실패 시 어설션(예: assert!) 패닉
    • 목적별 패닉은 panic! 매크로를 사용할 수 있습니다.
  • 패닉은 스택을 '해제'하여 함수가 반환된 것처럼 값을 삭제합니다.
  • 충돌(크래시)을 허용하지 않아야 하는 경우, 패닉을 유발하지 않는 API(Vec::get등)를 사용하면 됩니다.
This slide should take about 3 minutes.

기본적으로, 패닉이 발생하면 스택 되감기를 합니다. 스택 되감기는 다음과 같이 캐치가 가능합니다:

use std::panic;

fn main() {
    let result = panic::catch_unwind(|| "괜찮습니다.");
    println!("{result:?}");

    let result = panic::catch_unwind(|| {
        panic!("이런");
    });
    println!("{result:?}");
}
  • 포착은 흔하지 않습니다. catch_unwind로 예외를 구현하려고 시도하지 마세요.
  • 이것은 단일 요청이 크래시 되더라도 프로그램이 계속 실행되야 하는 서버에 유용합니다.
  • 만약 Cargo.toml설정파일에 panic = abort을 설정했다면 크래시를 캐치할 수 없습니다.