본문 바로가기
Languages/RUST

[RUST] TRPL : Chapter9 - Error Handling

by odaebum 2024. 11. 29.
728x90

Chapter 9 - Error Handling

복구할 수 없는 오류 - panic!

  • 패닉이 발생하는 경우
    1. 코드에 패닉을 유발하는 작업 수행
    2. panic! 매크로를 명시적으로 호출함
  • Cargo.toml
[profile.release]
panic = 'abort'

를 추가하여 설정할 수 있다.

복구할 수 있는 오류 - Result

  • Result는 다음과 같은 열거형을 갖는다.
enum Result<T, E> {
    Ok(T),
    Err(E),
}
  • 활용
use std::fs::File;

fn main() {
    let greeting_file_result = File::open("hello.txt");

    let greeting_file = match greeting_file_result {
        Ok(file) => file,
        Err(error) => panic!("Problem opening the file: {error:?}"),
    };
}
  • ErrorKind:: 를 활용하여 에러를 핸들링할 수 있다.
use std::fs::File;
use std::io::ErrorKind;

fn main() {
    let greeting_file = File::open("hello.txt").unwrap_or_else(|error| {
        if error.kind() == ErrorKind::NotFound {
            File::create("hello.txt").unwrap_or_else(|error| {
                panic!("Problem creating the file: {error:?}");
            })
        } else {
            panic!("Problem opening the file: {error:?}");
        }
    });
}
  • unwrap 보다는 expect 를 더 많이 선호한다.

operator ?

  • 반환 유형이 사용된 값과 호환되는 함수에서만 사용 가능하다.
  • result 값 뒤에 사용되며 match와 비슷하게 표현된다.
    • ok값으면 ok 값을 반환하고, err값이면 err를 반환한다.

오류 처리 지침

  • 코드가 나쁜 상태로 끝날 가능성이 있을 때 코드를 패닉 상태로 만드는 것이 좋다.
  • 수정할 방법이 없을때 패닉 상태를 반환하는 것이 좋다.
  • 그러나, 실패가 예상될때는 result로 반환하는 것이 더 적절하다.
  • 값에 대한 제한이 있는 경우, 구조체와 같은 형식으로 값을 받을 때 조건을 거는 것이 좋다.
728x90