Rust - Error Handling

Mickey·2022년 1월 15일
0

Rust

목록 보기
22/32
post-thumbnail
post-custom-banner

https://www.tutorialspoint.com/rust/rust_error_handling.htm

Rust에서 오류는 아래 표와 같이 크게 두 가지 범주로 분류

Sr.No.NameDescriptionUsage
1Recoverable처리할 수 있는 오류Result enum
2UnRecoverable처리할 수 없는 오류panic macro

Recoverable Error는 프로그램은 실패한 작업을 재시도하거나 복구 가능한 오류가 발생했을 때 다른 조치를 지정 가능
Recoverable Error로 인해 프로그램이 갑자기 종료되지는 않음
UnRecoverable는 오류로 인해 프로그램이 갑자기 종료됨
Recoverable Error가 발생하면 프로그램을 정상 상태로 되돌릴 수 없음
Recoverable Error는 실패한 작업을 다시 시도하거나 오류를 실행 취소할 수 없음

다른 프로그래밍 언어와 달리 Rust에는 예외가 없음
Recoverable Error에 대해서는 열거형 Result<T, E>를 반환
UnRecoverable가 발생하면 패닉 매크로를 호출
패닉 매크로는 프로그램이 갑자기 종료되도록 함

Panic Macro and Unrecoverable Errors

panic! 매크로를 사용하면 프로그램이 즉시 종료되고 피드백을 제공
프로그램이 unrecoverable 상태일때 사용

fn main() {
   panic!("Hello");
   println!("End of main"); //unreachable statement
}


panic! macro

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");
}


Result Enum and Recoverable Errors

Error

Enum Result<T,E>는 recoverable error를 처리하는 데 사용
OK와 Err의 두 가지 결과
T 및 E는 제네릭 유형 매개변수
T는 OK가 반환될 경우 값의 형식
E는 Err가 반환 될 경우의 오류 형식

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


Err 처리

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");
}


Err 반환

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());
   }
}


unwrap() and expect()

표준 라이브러리에는 열거형인 Result<T,E> 및 Option< T >과 연관된 몇 가지 도우미 메서드 포함

Sr.No.MethodSignitureDescription
1unwrap()unwrap(self):Tself가 Ok/Some일 것으로 예상하고 그 안에 포함된 값을 반환, 대신 Err 또는 None이면 표시된 오류 내용과 함께 패닉이 발생
2expect()expect(self, msg:&str):T오류 내용과 함께 패닉이 발생하기 전에 사용자 정의 메시지를 출력한다는 점을 제외하고는 unwrap과 같이 작동

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());
   }
}


expect()

패닉이 발생할 경우 프로그램에서 사용자 지정 오류 메시지를 반환

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");
}

profile
Mickey
post-custom-banner

0개의 댓글