Result 열거형
Result
열거형은 Option
열거형과 비슷하지만, Option
열거형은 Some
과 None
만을 가지고 있지만, Result
열거형은 Ok
와 Err
를 가지고 있습니다.
use std::fmt::Error; fn give_ok_or_err(bool: bool) -> Result<String, Error> { if bool { Ok(String::from("💖")) } else { Err(Error) } } fn main() { for bool in [true, false].iter() { let result = give_ok_or_err(*bool); match result { Ok(value) => println!("value: {}", value), Err(e) => println!("error: {}", e), } } }
Unwrap...
unwrap
use std::fmt::Error; fn give_ok_or_err(bool: bool) -> Result<String, Error> { if bool { Ok(String::from("💖")) } else { Err(Error) } } fn main() { let result = give_ok_or_err(false).unwrap(); println!("{}", result); }
unwrap_or
unwrap_or
는 Result<T, E>
를 T
로 변환합니다. 결과가 Ok(v)
이면 v
를 반환하고, Err(e)
이면 인수를 반환합니다.
use std::fmt::Error; fn give_ok_or_err(bool: bool) -> Result<String, Error> { if bool { Ok(String::from("💖")) } else { Err(Error) } } fn main() { let result = give_ok_or_err(false).unwrap_or(String::from("💔")); println!("{}", result); }
ok_or...
ok_or
와 ok_or_else
는 Option
ok_or
Option<T>
를 Result<T, E>
로 변환하여 일부(v
)를 Ok(v)
로, 없음(None
)을 Err(err)
로 매핑합니다.
ok_or에
전달된 인수는 즈ㄱ시 평가되며, 함수 호출의 결과를 전달하는 경우 느리게 평가되는 ok_or_else
를 사용하는 것이 좋습니다.
fn main() { let x = Some("foo"); assert_eq!(x.ok_or(0), Ok("foo")); let x: Option<&str> = None; assert_eq!(x.ok_or(0), Err(0)); }
ok_or_else
Option<T>
를 Result
<T, E>`로 변환하여 일부(v)를 Ok(v)로, 없음을 Err(err())로 매핑합니다.
fn main() { let x = Some("foo"); assert_eq!(x.ok_or_else(|| 0), Ok("foo")); let x: Option<&str> = None; assert_eq!(x.ok_or_else(|| 0), Err(0)); }
?
결과가 Ok
이 아닌 경우 즉시 함수를 종료하고 Err
을 반환합니다.
use std::fmt::Error; fn give_ok_or_err(bool: bool) -> Result<String, Error> { if bool { Ok(String::from("💖")) } else { Err(Error) } } fn question_mark(bool: bool) -> Result<String, Error> { let result = give_ok_or_err(bool)?; Ok(result) } fn main() { let result = question_mark(true); println!("{:?}", result); let result = question_mark(false); println!("{:?}", result); }
커스텀 예외 정의하기
import os
def get_content():
filepath = os.path.join(os.path.pardir, "test.txt")
with open(filepath, "r") as f:
return f.read()
class CustomError(Exception):
pass
if __name__ == '__main__':
try:
with open("hello.txt", "r") as file:
file.read()
except FileNotFoundError as exc:
print(exc)
except:
print("Unexpected error")
try:
content = get_content()
except:
raise CustomError
print(content)
use std::fmt;
use std::fs::File;
use std::io::{Error, ErrorKind, Read};
use std::path::Path;
fn get_content() -> Result<String, Error> {
let mut content = String::new();
let filepath = Path::new(std::env::current_dir().unwrap().parent().unwrap()).join("test.txt");
File::open(filepath)?.read_to_string(&mut content)?;
Ok(content)
}
#[derive(Debug, Clone)]
struct CustomError;
impl fmt::Display for CustomError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "File not found!")
}
}
fn main() {
let file = File::open("hello.txt");
match file {
Ok(file) => println!("{:?}", file),
Err(error) => match error.kind() {
ErrorKind::NotFound => println!("{:?}", error),
_ => println!("Unexpected error"),
},
}
let content = get_content().unwrap_or_else(|_| {
panic!("{}", CustomError);
});
println!("{}", content);
}