మాడ్యూల్ పాఠాలు (2/2)
లోపం నిర్వహణ మరియు ? ఆపరేటర్
రస్ట్ యొక్క తత్వశాస్త్రం లోపాల సంభావ్యతను స్పష్టంగా గుర్తించమని మరియు ప్రోగ్రామ్ కంపైల్ చేయబడే ముందు వాటిని నిర్వహించడానికి మీ కోడ్ను రూపొందించమని మిమ్మల్ని ప్రోత్సహిస్తుంది.
రస్ట్లోని ఎర్రర్లు రెండు ప్రధాన వర్గాలుగా విభజించబడ్డాయి: ** కోలుకోలేని లోపాలు** (panic! మాక్రో ద్వారా తక్షణ ముగింపుకు కారణమవుతాయి) మరియు ** పునరుద్ధరించదగిన లోపాలు** (Result<T, E> రకాన్ని ఉపయోగించి నిర్వహించబడతాయి).
ఫలితం <T, E> రకం మరియు నమూనా సరిపోలిక
చాలా వరకు తిరిగి పొందగలిగే లోపాలు Result<T, E> రకాన్ని అందిస్తాయి, ఇది ఒక enum ఇలా నిర్వచించబడింది:
enum Result<T, E> {
Ok(T),
Err(E),
}ఫలితాన్ని తనిఖీ చేయడానికి మేము నమూనా సరిపోలికను ఉపయోగించవచ్చు:
use std::fs::File;
fn main() {
let greeting_file_result = File::open("hello.txt");
let greeting_file = match greeting_file_result {
Ok(file) => file,
Err(error) => panic!("Problem opening the file: {:?}", error),
};
}? ఆపరేటర్తో లోపం ప్రచారం
ఒక ఫంక్షన్ను అమలు చేస్తున్నప్పుడు, దాని లోపల ఉన్న లోపాన్ని నేరుగా నిర్వహించే బదులు, మేము తరచుగా లోపాన్ని కాలర్కు తిరిగి ఇవ్వాలనుకుంటున్నాము, తద్వారా వారు ఏమి చేయాలో నిర్ణయించుకోవచ్చు. ఈ ప్రక్రియను ఎర్రర్ ప్రోపగేషన్ అంటారు.
రస్ట్ లోపాలను ప్రచారం చేయడానికి ? ఆపరేటర్ని వాక్యనిర్మాణ సత్వరమార్గంగా అందిస్తుంది. Result విలువ Ok అయితే, Ok యొక్క అంతర్గత విలువ వ్యక్తీకరణ ద్వారా అందించబడుతుంది; అది Err అయితే, మేము return Err(...)ని ఉపయోగించినట్లుగా మొత్తం ప్రస్తుత ఫంక్షన్ నుండి Err లోపం చూపబడుతుంది.
use std::fs::File;
use std::io::{self, Read};
fn read_username_from_file() -> Result<String, io::Error> {
let mut username_file = File::open("username.txt")?;
let mut username = String::new();
username_file.read_to_string(&mut username)?;
Ok(username)
}[!ముఖ్యమైనది]
?ఆపరేటర్ అది వర్తించే విలువకు (సాధారణంగాResult,Option, లేదా అమలు చేసే రకాలుFromResidual)కి అనుకూలమైన రకాన్ని అందించే ఫంక్షన్లలో మాత్రమే ఉపయోగించబడుతుంది.
కస్టమ్ లోపాలు
లోపం యొక్క మానవులు చదవగలిగే ప్రాతినిధ్యాన్ని అందించడానికి std::fmt::Display లక్షణాన్ని (మరియు ఐచ్ఛికంగా std::error::Error) అమలు చేయడం ద్వారా మేము మా స్వంత అనుకూల దోష రకాలను నిర్వచించవచ్చు:
use std::fmt;
#[derive(Debug)]
struct MyError {
details: String,
}
impl fmt::Display for MyError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Error: {}", self.details)
}
}
impl std::error::Error for MyError {}మీరే ప్రయత్నించండి
వ్యాయామం 1: తో ఫైల్ను చదవడం? ఆపరేటర్
read_username_from_file ఫంక్షన్ని పూర్తి చేయండి, తద్వారా ఇది ? ఫైల్ను తెరవడం మరియు దాని కంటెంట్ను వినియోగదారు పేరు స్ట్రింగ్లో చదవడం ద్వారా ఉత్పన్నమయ్యే లోపాలను ప్రచారం చేయడానికి ఆపరేటర్.
సూచనను చూపించు
లోపాలను ప్రచారం చేయడానికి `?` అక్షరం తర్వాత`ఫైల్ ::open(...)`మరియు తర్వాత`username_file.read_to_string(...)`ని జోడించండి.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
వ్యాయామం 2: ఒక సంఖ్యను అన్వయించి, రెట్టింపు చేయండి
parse_and_double పేరుతో ఒక ఫంక్షన్ను వ్రాయండి, అది స్ట్రింగ్ రిఫరెన్స్ &strని అంగీకరించి, <i32, std::num::ParseIntError> ఫలితాన్ని అందిస్తుంది. ఫంక్షన్ val.parse::<i32>()ని ఉపయోగించి స్ట్రింగ్ని అన్వయించాలి? పార్సింగ్ లోపాలను ప్రచారం చేయడానికి మరియు విజయం సాధించిన తర్వాత సరితో చుట్టబడిన రెట్టింపు విలువను తిరిగి ఇవ్వండి.
సూచనను చూపించు
స్ట్రింగ్ని అన్వయించడానికి మరియు లోపాన్ని ప్రచారం చేయడానికి `val.parse::<i32>()?`ని ఉపయోగించండి, ఆపై `Ok(num \* 2)`ని తిరిగి ఇవ్వండి.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
వ్యాయామం 3: కస్టమ్ ఎర్రర్ను నిర్వచించడం
CustomError పేరుతో ఖాళీ నిర్మాణాన్ని నిర్వచించండి. fmt పద్ధతిలో దోష సందేశంగా 'Si e verificato un errore personalizzato' అని వ్రాయడం ద్వారా దాని కోసం std::fmt::డిస్ప్లే లక్షణాన్ని అమలు చేయండి.
సూచనను చూపించు
`struct CustomError;` అని డిక్లేర్ చేయండి మరియు వ్రాయడం ద్వారా డిస్ప్లేని అమలు చేయండి!(f, "Si e verificato un errore personalizzato")``fmt` పద్ధతిలో.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది