Rust의 오류 처리
소개
이 기사에서는 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 기사이며 더 많은 글을 쓸 수 있기를 기대합니다. 질문이나 의견이 있으면 의견 섹션에서 자유롭게 질문하십시오.
Reference
이 문제에 관하여(Rust의 오류 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ecj222/error-handling-in-rust-7pp텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)