
52
이펙티브 러스트
MyError::General(s) => write!(f, "General error: {}", s),
}
}
}
또한 중첩된 오류에 쉽게 접근할 수 있도록 디폴트
source
()
구현을 오버라이드(재정의)
override
하는 것이 좋다.
use std::error::Error;
impl Error for MyError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
MyError::Io(e) => Some(e),
MyError::Utf8(e) => Some(e),
MyError::General(_) => None,
}
}
}
enum
을 사용하면 다양한 오류 클래스에 대한 타입 정보를 모두 보존하면서, 오류 처리 코드도
간결하게 작성할 수 있다.
use std::io::BufRead; // `.read_until()`을 사용하기 위해 추가
/// 최대 줄 길이
const MAX_LEN: usize = 1024;
/// 주어진 파일의 첫 줄을 반환한다.
pub fn first_line(filename: &str) -> Result<String, MyError> {
let file = std::fs::File::open(filename).map_err(MyError::Io)?; ...