ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 7 · 2లో పాఠం 2కోర్సులో 14/14~15 min
మాడ్యూల్ పాఠాలు (2/2)

లోపం నిర్వహణ మరియు ? ఆపరేటర్

రస్ట్ యొక్క తత్వశాస్త్రం లోపాల సంభావ్యతను స్పష్టంగా గుర్తించమని మరియు ప్రోగ్రామ్ కంపైల్ చేయబడే ముందు వాటిని నిర్వహించడానికి మీ కోడ్‌ను రూపొందించమని మిమ్మల్ని ప్రోత్సహిస్తుంది.

రస్ట్‌లోని ఎర్రర్‌లు రెండు ప్రధాన వర్గాలుగా విభజించబడ్డాయి: ** కోలుకోలేని లోపాలు** (panic! మాక్రో ద్వారా తక్షణ ముగింపుకు కారణమవుతాయి) మరియు ** పునరుద్ధరించదగిన లోపాలు** (Result<T, E> రకాన్ని ఉపయోగించి నిర్వహించబడతాయి).


ఫలితం <T, E> రకం మరియు నమూనా సరిపోలిక

చాలా వరకు తిరిగి పొందగలిగే లోపాలు Result<T, E> రకాన్ని అందిస్తాయి, ఇది ఒక enum ఇలా నిర్వచించబడింది:

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

ఫలితాన్ని తనిఖీ చేయడానికి మేము నమూనా సరిపోలికను ఉపయోగించవచ్చు:

Rust
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 లోపం చూపబడుతుంది.

Rust
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) అమలు చేయడం ద్వారా మేము మా స్వంత అనుకూల దోష రకాలను నిర్వచించవచ్చు:

Rust
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: తో ఫైల్‌ను చదవడం? ఆపరేటర్

వ్యాయామం#rust.m7.l2.e1
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

read_username_from_file ఫంక్షన్‌ని పూర్తి చేయండి, తద్వారా ఇది ? ఫైల్‌ను తెరవడం మరియు దాని కంటెంట్‌ను వినియోగదారు పేరు స్ట్రింగ్‌లో చదవడం ద్వారా ఉత్పన్నమయ్యే లోపాలను ప్రచారం చేయడానికి ఆపరేటర్.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

లోపాలను ప్రచారం చేయడానికి `?` అక్షరం తర్వాత`ఫైల్ ::open(...)`మరియు తర్వాత`username_file.read_to_string(...)`ని జోడించండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం 2: ఒక సంఖ్యను అన్వయించి, రెట్టింపు చేయండి

వ్యాయామం#rust.m7.l2.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

parse_and_double పేరుతో ఒక ఫంక్షన్‌ను వ్రాయండి, అది స్ట్రింగ్ రిఫరెన్స్ &strని అంగీకరించి, <i32, std::num::ParseIntError> ఫలితాన్ని అందిస్తుంది. ఫంక్షన్ val.parse::<i32>()ని ఉపయోగించి స్ట్రింగ్‌ని అన్వయించాలి? పార్సింగ్ లోపాలను ప్రచారం చేయడానికి మరియు విజయం సాధించిన తర్వాత సరితో చుట్టబడిన రెట్టింపు విలువను తిరిగి ఇవ్వండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

స్ట్రింగ్‌ని అన్వయించడానికి మరియు లోపాన్ని ప్రచారం చేయడానికి `val.parse::<i32>()?`ని ఉపయోగించండి, ఆపై `Ok(num \* 2)`ని తిరిగి ఇవ్వండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం 3: కస్టమ్ ఎర్రర్‌ను నిర్వచించడం

వ్యాయామం#rust.m7.l2.e3
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

CustomError పేరుతో ఖాళీ నిర్మాణాన్ని నిర్వచించండి. fmt పద్ధతిలో దోష సందేశంగా 'Si e verificato un errore personalizzato' అని వ్రాయడం ద్వారా దాని కోసం std::fmt::డిస్‌ప్లే లక్షణాన్ని అమలు చేయండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

`struct CustomError;` అని డిక్లేర్ చేయండి మరియు వ్రాయడం ద్వారా డిస్ప్లేని అమలు చేయండి!(f, "Si e verificato un errore personalizzato")``fmt` పద్ధతిలో.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది