오류 변환
From 구현
오류 변환은(는) CoddyKit의 무료 Learn Rust Coding 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn Rust Coding 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.
오류를 변환하는 이유
코드의 서로 다른 계층은 서로 다른 오류 형식을 생성합니다. 하나의 함수에서 오류를 전달하려면 하위 계층의 오류를 통합된 형식으로 변환해야 합니다. Rust에서는 From 트레이트를 통해 이를 처리합니다.
From 트레이트
From<T>는 한 형식에서 다른 형식을 만드는 방법을 정의합니다. 오류 형식에 이를 구현하면 원본 오류를 해당 형식으로 변환할 수 있습니다.
trait From<T> {
fn from(value: T) -> Self;
}?는 From을 사용하는 방식
expr?를 작성했을 때 오류 형식이 함수의 반환 오류 형식과 다르면, 연산자는 From::from을 호출하여 변환합니다. 이것이 오류를 매끄럽게 전달하는 핵심 원리입니다.
통합된 오류 형식
함수가 발생시킬 수 있는 각 종류의 오류를 담을 열거형을 정의합니다.
#[derive(Debug)]
enum AppError {
Io(std::io::Error),
Parse(std::num::ParseIntError),
}From 구현하기
각 원본 오류에 대해 From impl을 작성하여 해당 오류가 일치하는 variant로 변환되게 합니다.
impl From<std::io::Error> for AppError {
fn from(e: std::io::Error) -> Self {
AppError::Io(e)
}
}
impl From<std::num::ParseIntError> for AppError {
fn from(e: std::num::ParseIntError) -> Self {
AppError::Parse(e)
}
}자동으로 전달하기
이러한 impl을 작성해 두면 ?가 각 오류를 자동으로 AppError로 변환합니다.
fn read_count(path: &str) -> Result<i32, AppError> {
let text = std::fs::read_to_string(path)?; // io::Error -> AppError
let n: i32 = text.trim().parse()?; // ParseIntError -> AppError
Ok(n)
}Into는 반대쪽 대응물입니다
From<A> for B를 구현하면 자동으로 A: Into<B>가 제공됩니다. From을 구현하는 편이 좋습니다. 그러면 into()도 자동으로 사용할 수 있습니다.
fn make() -> AppError {
let e: std::io::Error = std::io::Error::other("boom");
e.into() // uses From<io::Error> for AppError
}트레이트 객체 박싱하기
빠르게 변환하려면 Box<dyn Error>를 사용할 수 있습니다. 표준 라이브러리가 모든 오류 형식에서 이 형식으로 변환하는 포괄적인 From impl을 제공하기 때문입니다.
use std::error::Error;
fn run() -> Result<(), Box<dyn Error>> {
let n: i32 = "42".parse()?; // ParseIntError -> Box<dyn Error>
println!("{n}");
Ok(())
}From을 생성하는 크레이트
각 From impl을 직접 작성하는 일은 번거롭습니다. thiserror의 #[from] 특성은 이를 생성하고, anyhow는 모든 오류를 하나의 형식으로 자동 변환합니다.
방식 선택하기
변환 전략을 요약하면 다음과 같습니다:
- 수동
Fromimpl — 완전한 제어, 더 많은 코드 thiserror #[from]— 타입이 지정된 오류, 자동 생성되는 implBox<dyn Error>또는anyhow— 최소한의 반복 작업
변환 중 맥락 추가하기
From impl은 오류를 감싸는 것 이상의 작업을 할 수 있습니다. 오류를 더 풍부하게 만들 수도 있습니다. 여기서는 변환 과정에서 추가 맥락을 덧붙여 최종 오류를 더 유용하게 만듭니다.
impl From<std::num::ParseIntError> for AppError {
fn from(e: std::num::ParseIntError) -> Self {
// could log or annotate here before wrapping
AppError::Parse(e)
}
}빠른 확인
? 연산자는 한 오류 형식을 다른 형식으로 변환할 때 어떤 트레이트를 사용하나요?
정리
오류 변환에 대해 다음을 배웠습니다:
?는From트레이트를 통해 오류를 변환합니다- 오류 열거형에
From<Source>를 구현합니다 From을 구현하면Into와into()를 자동으로 사용할 수 있습니다Box<dyn Error>는 모든 오류를 받아들입니다thiserror와anyhow는 반복적인 코드를 자동화합니다
자주 묻는 질문
“오류 변환” 강의는 무료인가요?
네 — “오류 변환” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn Rust Coding 강의 전체를 잠금 해제할 수 있습니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.
“오류 변환”에서 뭘 배우나요?
From 구현 브라우저에서 직접 실행하는 실습 코드로 Learn Rust Coding을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Learn Rust Coding을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Learn Rust Coding은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“오류 변환” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Learn Rust Coding 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Learn Rust Coding 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.