Rust, Custom Error Handling
프로그램 언어들은 예외 핸들링(exception handling) 또는 반환 값(return value) 이라는 두 가지 에러 핸들링 접근 방식 중 한 가지를 사용한다. Rust는 후자를 사용한다.1 이전 글 Rust 예외 및 에러 처리에서 복구 가능한 에러를 위한 Result<T, E> 사용법을 살펴봤다.
Rust의 Result는 한가지 에러 타입만 처리가 기본적으로 가능하다. 두 가지 이상의 다른 에러 타입은 처리가 불가능할 때 사용할 수 있는 Custom Error Handling 방법을 이번 글에서 살펴본다. 에러처리 간소화를 위한 thiserror, anyhow 크레이트 예제를 소개하였다.
에러처리 실패 사례
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use std::fs::File;
use std::io::Write;
use std::num::ParseIntError;
fn main() {
println!("{:?}", square("2"));
println!("{:?}", square("invalid"));
}
fn square(val: &str) -> Result<i32, ParseIntError> {
let num = val.parse::<i32>()?;
let mut f = File::open("file.txt")?;
let string_to_write = format!("Square of {} is {}", num, i32::pow(num, 2));
f.write(string_to_write.as_bytes())?;
Ok(i32::pow(num, 2))
}
/*
the trait `From<std::io::Error>` is not implemented for `ParseIntError`
ParseIntError, Error : 에러 타입이 두 가지지만 하나의 에러 타입만 지정
*/