https://www.tutorialspoint.com/rust/rust_error_handling.htm
Rust에서 오류는 아래 표와 같이 크게 두 가지 범주로 분류
Sr.No. | Name | Description | Usage |
---|---|---|---|
1 | Recoverable | 처리할 수 있는 오류 | Result enum |
2 | UnRecoverable | 처리할 수 없는 오류 | panic macro |
Recoverable Error는 프로그램은 실패한 작업을 재시도하거나 복구 가능한 오류가 발생했을 때 다른 조치를 지정 가능
Recoverable Error로 인해 프로그램이 갑자기 종료되지는 않음
UnRecoverable는 오류로 인해 프로그램이 갑자기 종료됨
Recoverable Error가 발생하면 프로그램을 정상 상태로 되돌릴 수 없음
Recoverable Error는 실패한 작업을 다시 시도하거나 오류를 실행 취소할 수 없음
다른 프로그래밍 언어와 달리 Rust에는 예외가 없음
Recoverable Error에 대해서는 열거형 Result<T, E>를 반환
UnRecoverable가 발생하면 패닉 매크로를 호출
패닉 매크로는 프로그램이 갑자기 종료되도록 함
panic! 매크로를 사용하면 프로그램이 즉시 종료되고 피드백을 제공
프로그램이 unrecoverable 상태일때 사용
fn main() {
panic!("Hello");
println!("End of main"); //unreachable statement
}
fn main() {
let a = [10,20,30];
a[10]; //invokes a panic since index 10 cannot be reached
}
fn main() {
let no = 13;
//try with odd and even
if no%2 == 0 {
println!("Thank you , number is even");
} else {
panic!("NOT_AN_EVEN");
}
println!("End of main");
}
Enum Result<T,E>는 recoverable error를 처리하는 데 사용
OK와 Err의 두 가지 결과
T 및 E는 제네릭 유형 매개변수
T는 OK가 반환될 경우 값의 형식
E는 Err가 반환 될 경우의 오류 형식
enum Result<T,E> {
OK(T),
Err(E)
}
use std::fs::File;
fn main() {
let f = File::open("main.jpg"); // main.jpg doesn't exist
match f {
Ok(f)=> {
println!("file found {:?}",f);
},
Err(e)=> {
println!("file not found \n{:?}",e); //handled error
}
}
println!("end of main");
}
fn main(){
let result = is_even(13);
match result {
Ok(d)=>{
println!("no is even {}",d);
},
Err(msg)=>{
println!("Error msg is {}",msg);
}
}
println!("end of main");
}
fn is_even(no:i32)->Result<bool,String> {
if no%2==0 {
return Ok(true);
} else {
return Err("NOT_AN_EVEN".to_string());
}
}
표준 라이브러리에는 열거형인 Result<T,E> 및 Option< T >과 연관된 몇 가지 도우미 메서드 포함
Sr.No. | Method | Signiture | Description |
---|---|---|---|
1 | unwrap() | unwrap(self):T | self가 Ok/Some일 것으로 예상하고 그 안에 포함된 값을 반환, 대신 Err 또는 None이면 표시된 오류 내용과 함께 패닉이 발생 |
2 | expect() | expect(self, msg:&str):T | 오류 내용과 함께 패닉이 발생하기 전에 사용자 정의 메시지를 출력한다는 점을 제외하고는 unwrap과 같이 작동 |
unwrap() 함수는 작업이 성공한 실제 결과를 반환
작업이 실패하면 기본 오류 메시지와 함께 패닉을 반환
fn main(){
let result = is_even(10).unwrap();
println!("result is {}",result);
println!("end of main");
}
fn is_even(no:i32)->Result<bool,String> {
if no%2==0 {
return Ok(true);
} else {
return Err("NOT_AN_EVEN".to_string());
}
}
패닉이 발생할 경우 프로그램에서 사용자 지정 오류 메시지를 반환
use std::fs::File;
fn main(){
let f = File::open("pqr.txt").expect("File not able to open");
//file does not exist
println!("end of main");
}