패닉
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
을 설정했다면 크래시를 캐치할 수 없습니다.