Rust의 오류 처리

10586 단어 rusttutorialbeginners

소개



이 기사에서는 Rust의 오류 처리와 이것이 Rust 웹 애플리케이션의 성능을 어떻게 향상시키는지 살펴볼 것입니다.

오류 처리는 소프트웨어 개발의 중요한 부분입니다. 왜냐하면 빌드할 때 소프트웨어에 대해 생각하는 방식을 개선하고 오류/실패를 가로챌 수 있기 때문입니다.

소프트웨어를 빌드할 때 코드에서 버그나 오류가 발생하는 경향이 있으며 그럴 때 문제를 효율적으로 식별하는 데 도움이 되는 큰 오류 메시지가 나타납니다. 이는 결과적으로 생산성을 높이고 더 나은 개발자 경험으로 이어질 수 있습니다.

Rust와 다른 프로그래밍 언어의 오류 처리의 주요 차이점



예외를 발생시켜 오류를 처리하는 다른 프로그래밍 언어와 비교하여 Rust는 실제 오류를 반환하여 오류를 처리합니다. 예외를 던지는 것은 오류 유형 및 오류 보고를 식별하는 데 매우 유용하지만 매우 명시적이지 않습니다. 즉, 예외 처리가 있어야 하는 코드 영역을 놓치기 쉽습니다. 반면에 Rust는 명시적으로 오류를 반환합니다.

Rust가 오류를 처리하는 방법



결과 유형



결과 유형Result<T, E>은 두 가지 가능한 상태가 있는 열거형입니다.

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

T는 모든 유형이 될 수 있고 E는 모든 오류가 될 수 있습니다. 두 상태Ok(T)는 성공을 나타내며 값을 보유하고, Err(E)는 오류를 나타내고 특정 오류 값을 보유합니다.

작업이 잘못될 수 있는 경우 결과 유형을 사용합니다. 작업은 성공할 것으로 예상되지만 실패하는 경우가 있을 수 있습니다.

예를 들어:

use std::num::ParseIntError;

fn convert_string_to_integer(number_str: &str) -> Result<(), ParseIntError> {
    let number:i32 = match number_str.parse() {
        Ok(number) => number,
        Err(e) => return Err(e)
    };

    println!("{}", number); // 200

    Ok(())
}


다음은 발생합니다.
  • convert_string_to_integer가 호출되면 이 함수는 함수에 전달된 문자열 매개변수를 기반으로 문자열을 정수 값으로 변환합니다.
  • match number_str.parse()를 사용하면 두 가지 가능한 상태를 처리해야 합니다. 숫자만 포함된 문자열을 전달하면 작업이 성공하고 변환된 값을 number 변수에 할당하거나 작업이 실패할 때 오류를 반환하여 함수에서 반환합니다.

  • 공황



    Rust에서 복구할 수 없는 오류가 발생하면 panic! 로 처리할 수 있습니다. panic!를 사용하면 이러한 종류의 오류가 발생했을 때 프로그램 실행을 중지할 수 있으며 유용한 피드백도 제공합니다.

    다음은 예입니다.

    use std::num::ParseIntError;
    
    fn convert_string_to_integer(number_str: &str) -> Result<(), ParseIntEror> {
        let number:i32 = match number_str.parse() {
            Ok(number) => number,
            Err(_) => panic!("Invalid digit found in string")
        };
    
        println!("{}", number); // 200
    
        Ok(())
    }
    


    이 함수에서 오류가 발생하면panic!('Invalid digit found in string')가 호출됩니다.

    풀다



    작성한 코드에 대해 매우 자신 있고 코드에 오류가 발생하지 않을 것이라고 확신하고 오류 처리를 옵트아웃하고 싶은 상황이 있을 수 있습니다.

    이 경우 다음과 같이 unwrap() 메서드를 사용하면 됩니다.

    fn convert_string_to_integer() -> i32 {
        let number_str:&str = "200";
        let number:i32 = number_str.parse().unwrap();
    
        return number; 
    }
    
    let result = convert_string_to_integer();
    println!("{}", result); // 200
    


    예상하다


    expect() 메서드는 unwrap()와 비슷하지만 unwrap() 와 달리 expect() 메서드를 사용하면 오류 메시지를 설정할 수 있습니다. 이렇게 하면 디버깅이 훨씬 쉬워집니다.

    fn convert_string_to_integer(number_str: &str) {
        let number_str:&str = "o100" 
        let number:i32 = number_str.parse();
    
        number.expect("Invalid digit in string");
    }
    


    출력

    thread 'main' panicked at 'Invalid digit in string: ParseIntError { kind: InvalidDigit }', src/main.rs:11:20
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    


    물음표 연산자(?)



    (?) 연산자를 사용하면 오류 전파가 훨씬 쉬워지며 일치 표현식과 동일합니다. 함수를 구현할 때 많은 장황함을 없애고 Result<T, E>  및  Option<T> 유형에만 적용할 수 있습니다. 일치 표현식과 달리 Ok이면 Result의 압축을 풀고 그렇지 않으면 오류를 반환합니다.

    예를 들어:

    use std::num::ParseIntError;
    
    fn convert_string_to_integer(number_str: &str) -> Result<i32, ParseIntError>  {
        let number:i32 = number_str.parse()?;
    
        Ok(number)
    }
    
    let result = convert_string_to_integer("200");
    println!("{:?}", result); // Ok(200)
    


    코드가 훨씬 더 간단하고 읽기 쉬워 보이는지 확인하십시오.

    결론



    오류 처리는 좋은 의사 소통에 관한 것입니다. Rust는 오류 처리를 개발자에게 좋은 경험으로 만드는 데 중점을 두었습니다.

    물론 Rust에서 오류 처리를 위해 더 많은 방법을 사용하지만 이 기사에서 다루는 방법을 통해 시작해야 합니다. 이것은 또한 저의 첫 번째 기술적인 Rust 기사이며 더 많은 글을 쓸 수 있기를 기대합니다. 질문이나 의견이 있으면 의견 섹션에서 자유롭게 질문하십시오.

    좋은 웹페이지 즐겨찾기