1. 개요

  • 에러는 소프트웨어에서 피할 수 없는 현실.

  • 에러의 범주:

    1. 복구 가능한 에러
      • 파일을 찾지 못하는 에러.
    2. 복구 불가능한 에러
      • 배열의 끝을 넘어선 위치의 값을 접근하려는 시도.
  • 대부분의 에러는 범주를 분간하지 않고 예외 처리(exception)으로 처리함.

  • Rust는 예외 처리 기능이 없다.

  • 대신 다음 기능을 이용해서 처리:

    1. 복구 가능한 에러를 위한 Result<T, E>
    2. 복구 불가능한 에러가 발생했을 때 실행을 멈추는 panic! 매크로

2. panic!

fn main() {
    panic!("crash and burn");
}
  • panic! 매크로가 실행되면
    1. 실패 메세지 출력
    2. 스택 되감고 청소
    3. 종료
  • 버그가 발견되었지만 에러를 어떻게 처리할지 명확하지 않을 때 사용.
let v = vec![1, 2, 3];
v[99]; // panic이 발생한다.
  • /rustc/...\src\libcore\slice\mod.rs 에서 패닉이 발생한다.
  • [] 를 사용할 때 실행되는 코드에서 panic! 이 발생한다.

Backtrace

$ SET RUST_BACKTRACE=1
$ cargo run
  • 백트레이스(backtrace)란 어떤 지점에 도달하기 까지 호출해온 모든 함수의 리스트.
  • RUST_BACKTRACE 를 설정하면 에러가 어떤 과정을 거쳐서 발생했는지 자세히 알 수 있다.
  • 백트레이스를 보기 위해서 디버그 심볼이 활성되어 있어야 함.
  • 디버그 실볼은 다음 상황에서 활성화 된다:
    • cargo build
    • cargo run--release 플래그 없이 실행했을 때

Abort

  • panic! 이 발생하면 되감기(unwindling)을 수행.
  • 패닉은 마주친 각 함수로부터 스택을 거꾸로 훑어가면서 데이터를 제거.
  • 훑어가기 및 제거는 일이 많고 무겁다.
  • 대안으로 그만두기(abort)를 사용할 수 있다.
    • 사용시 메모리는 운영체제의 의해 청소될것.
    • 바이너리가 작아진다.
# Cargo.toml

[profile]
panic = 'abort'

# 릴리즈 버젼에서 패닉 발생시 그만두기(abort) 사용.
[profile.release]
panic = 'abort'

참고자료