오류 열거형 (Error Enums)
이전 연습 문제에서 작성한 해결책이 조금 어색하게 느껴졌을 수도 있습니다. 문자열을 패턴 매칭(Pattern matching)에 직접 사용하는 것은 좋은 방법이 아니기 때문이죠! 만약 동료가 가독성을 높이기 위해 Ticket::new가 반환하는 오류 메시지를 수정한다면, 그 함수를 호출하던 여러분의 코드는 갑자기 작동하지 않게 될 것입니다(Breaking changes).
이 문제를 해결할 수 있는 도구는 이미 우리가 배운 것에 있습니다. 바로 **열거형(Enum)**입니다!
오류에 대처하기
발생한 특정 오류 상황에 따라 호출자가 다르게 동작하도록 만들고 싶다면, 열거형을 사용해 다양한 오류 케이스를 정의할 수 있습니다.
// 문자열에서 `u32`를 파싱할 때 발생할 수 있는
// 다양한 오류 상황을 나타내는 오류 열거형.
enum U32ParseError {
NotANumber,
TooLarge,
Negative,
}
오류 열거형을 사용하면 발생 가능한 오류 상황들을 타입 시스템에 직접 인코딩하게 됩니다. 이는 실패할 가능성이 있는 함수의 **시그니처(Signature)**의 일부가 되죠. 이제 호출하는 쪽에서는 match 표현식을 사용해 각각의 오류 케이스에 맞게 대응할 수 있어, 오류 처리가 훨씬 명확하고 간결해집니다.
match s.parse_u32() {
Ok(n) => n,
Err(U32ParseError::Negative) => 0,
Err(U32ParseError::TooLarge) => u32::MAX,
Err(U32ParseError::NotANumber) => {
panic!("숫자가 아닙니다: {}", s);
}
}
Exercise
The exercise for this section is located in 05_ticket_v2/08_error_enums