Thinking Different




Result<T, E>

복구 가능한 에러 처리 방법에 대해 살펴보도록 한다.

 

enum Result<T, E> {
    Ok(T),
    Err(E),
}

성공시 Ok(T), 실패시 Err(E) 인 2개의 variant 를 갖는다

 

 

에러 처리 방식 예제

use std::fs::File;

fn main() 
{
    let file = File::open("test.txt");

    if file.is_ok() 
    {
        println!("성공 : {:?} ", file.ok());
    } 
    else 
    {
        println!("실패 : {:?}", file.err());
    }
}


// 결과

FAILE!!! : Some(Os { code: 2, kind: NotFound, message: "지정된 파일을 찾을 수 없습니다." })
 *  터미널이 작업에서 다시 사용됩니다. 닫으려면 아무 키나 누르세요.

 

 

match 로 에러 값을 매핑시켜 새로운 코드를 작성할 수 있다.

use std::fs::File;
use std::io::ErrorKind;

fn main() 
{
    let _f = File::open("test.txt");

    let _f = match _f 
    {
        Ok(file) => file,
        Err(error) => match error.kind() 
        {
            ErrorKind::NotFound => match File::create("test.txt") 
            {
                Ok(fc) => fc,
                Err(e) => panic!("파일 생성 실패 : {:?}", e),
            },
            other_error => panic!("파일 읽기 실패 : {:?}", other_error),
        },
    };
}

파일이 존재한다면 file를 반환하지만, 만약 Err(error) 인 경우 match를 통해서 kind의 인자가 NotFound 인 경우 파일을 생성한다, 그 후 파일 생성에서도 Result<T, E>로 오류 체크를 하여 생성 성공 여부를 panic! 으로 처리된다.

 

 

unwrap과 expect 를 사용하여 간단히 에러 처리

 

match를 통한 에러 처리와는 다르게 간단하고 빠르게 처리할 수 있는 방법이다.

 

(1) unwrap

unwrap은 Ok 시 Ok 내부의 값을 반환하고, Err라면 panic!을 일으킨다.

use std::fs::File;

fn main() 
{
    let _f = File::open("test.txt").unwrap();
}

test.txt 파일이 없는 경우 panic! 처리됨

 

(2) expect

unwrap 와 같이 panic! 처리 되며, 에러 메시지를 사용자가 정의할 수 있다.

use std::fs::File;

fn main() 
{
    let _f = File::open("test.txt").expect("test.txt 파일 없음");
}

사용자 정의 에러 메시지 출력