에러 핸들링



러스트의 에러는 회복 가능한(recoverable) 에러와 회복 불가능한(unrecoverable) 에러로 나눌 수 있음. 회복 가능한 에러는 프로그램을 바로 죽일 정도는 아닌, 런타임에 충분히 대응할 수 있는 에러를 의미하고, 회복 불가능한 에러는 그렇지 못한 에러임. 자바로 치면 체크드 익셉션을 써야 할 상황과 언체크드 인셉션을 써야 할 상황으로 생각하면 됨.


러스트에 익셉션을 없음. 대신 Result<T, E> 타입과 panic! 매크로가 존재함. Result<T, E> 는 회복 가능한 에러에, panic! 은 회복 불가능한 에러에 사용됨.



panic! 매크로


런타임에 에러가 발생했고 이 에러에 대해 해결할 수 있는 방법이 없는 경우, panic! 매크로를 사용함. 이 매크로는 프로그램 구동 중 에러가 발생했음을 알리고 프로그램을 즉각 종료함.


프로그램을 종료하는 과정에는 unwinding 이 있음. 이는 스택을 비우고 프로그램이 사용했던 메모리를 청소하는 작업임. 기본적으로 panic! 을 만나 프로그램이 종료되면 이 작업이 수행되는데, 이 작업은 내부적으로 상당히 많은 일을 필요로 함. 때문에 이 작업 없이 그냥 프로그램을 즉각 종료하도록 하는 방법이 마련되어 있음. 이렇게 하면 프로그램이 사용하던 메모리는 OS에 의해 청소되어야 함. 바이너리를 가능한 작게 만들고 싶을 경우 이 방법을 사용할 수도 있음. 방법은 Cargo.toml 파일에 다음 코드를 넣는 것.


[profile.release]

panic = 'abort'



패닉을 사용하는 방법은 간단함.


fn main() {
panic!("crash and burn");
}


위 코드는 실행되자마자 종료됨. 그리고 아래 메시지를 남김.


panic! 에 파라미터로 전달한 메시지가 포함됨. ("crash and burn")


그런데 복잡한 모듈 구조와 다양한 외부 라이브러리를 사용하면 위와 같은 메시지로는 에러가 발생한 정확한 위치를 찾기 어려움. 콜 스택 트레이스와 같은 정보가 필요함. 여기에 환경변수 RUST_BACKTRACE 를 사용하면 됨.


RUST_BACKTRACE 는 아래와 같이 사용(윈도우 기준).


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

vec[99];
}


위 코드를 그냥 컴파일 하면 아래와 같이 에러가 뜸.



set RUST_BACKTRACE=1 후에 컴파일 시도하면 사용하면 아래와 같이 에러가 뜸.


스택 트레이스의 라인넘버 10 을 보면 main.rs 가 나옴. 여기서부터 에러를 찾아가면 됨.







'Rust' 카테고리의 다른 글

제너릭 타입  (0) 2018.02.27
에러 핸들링(Result)  (0) 2018.02.26
컬렉션(해시맵)  (0) 2018.02.25
컬렉션(스트링)  (0) 2018.02.24
컬렉션(벡터)  (0) 2018.02.24

+ Recent posts