시뻘건 개발 도전기

러스트 20 - 예외처리 #1 : panic! 본문

프로그래밍/RUST

러스트 20 - 예외처리 #1 : panic!

시뻘건볼때기 2019. 4. 14. 15:21
반응형

 

러스트의 에러는 크게 두 가지로 나눈다.

  • Recoverable Errors : 복구 가능한 에러
  • Unrecoverable Errors : 복구 불가능한 에러

복구 가능한 에러의 경우에는 사용자에게 문제를 이야기하고 해당 요청을 재시도 할 수 있도록 한다.

복구 불가능한 에러는 버그의 종류(?)로써, Index를 벗어난다거나, 0으로 나누려고 하는 경우 등과 같이 뻑(?)나는 경우를 이야기 한다.

 

 

 

1. panic!

panic! 매크로가 실행되면, 프로그램은 실패 메시지를 출력하고, 스택 해제와 더불어, 정리하고 종료시킨다.

 

panic! 응답으로 인한 중단 혹은 스택 해제

panic! 매크로가 실행되면, 프로그래램은 unwinding(해제)을 시작한다.
이것은 러스트가 panic!을 마주친 함수들로부터 스택을 거꾸로 체크해가면서 데이터를 정리한다는 의미다.
이 작업은 상당히 많은 일을 해야한다.
만약, 이 많은 일이 부담스럽다면, 즉각 중단(abort)이 있는데, 데이터 제거 없이 프로그램을 종료하는 것을 말한다. 이렇게 종료된 프로그램이 사용하던 메모리는 OS가 정리해주어야 한다.

만약 프로젝트 내의 결과 바이너리를 최소화 하고 싶다면, Cargo.toml을 수정하면 된다.
[profile] 부분에서 panic = 'abort'를 추가하면 된다.

 

    panic!을 사용해 보자.
fn main() {
    panic!("EXCUTION! : 예외처리!!!");
}

에러 메시지에도 친절하게 stack backtrace라고 나오면서, 스택이 정리되는 로깅도 주르륵 보인다.

 

2. Backtrace

백트레이스를 알아보기 전에 panic!이 발생될 때 어떻게 되는지 먼저 알아보자.

fn main() {
    let v = vec![1, 2, 3];

    v[99];
}

백터는 3가지의 element를 가지고 있지만, 100번째의 element에 접근하고 있다. 이 때, 러스트는 패닉을 일으킨다.

진정 러스트가 뱉는 메시지는 다음과 같다.

thread 'main' panicked at 'index out of bounds: the len is 3 but the index is 99', libcore\slice\mod.rs:2448:10 stack backtrace:

심지어 라이브러리 위치와 파일, 코드 라인까지, "length가 3인데 99 index에 접근하고 있어서 index가 벗어났다." 라고 확실하고 친절하게 다 알려준다. (지금까지 이런 컴파일러는 없었다. 컴파일러인가 사람인가)

해당 위치로 가보면 panic!이 실행되는 코드일 것이다.

 

logging된 것을 잘 보면 RUST_BACKTRACE 환경 변수를 설정해서 에러의 원인을 정확하게 파악한 백트레이스를 얻을 수 있다고 알려준다. 백트레이스는 어떠한 지점에 도달하기 위해 호출된 모든 함수의 리스트를 말한다. (상위 내용에서 언급했 듯이, 스택을 거꾸로 올라가면서 체크한다는 이야기가 바로 이 부분...)

 

반응형
Comments