মূল কন্টেন্টে যান
মডিউল 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 হয়, Err ত্রুটিটি পুরো বর্তমান ফাংশন থেকে ফেরত দেওয়া হয় যেন আমরা একটি return 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 ফাংশনটি সম্পূর্ণ করুন যাতে এটি ব্যবহার করে? অপারেটর ফাইলটি খোলার মাধ্যমে এবং ব্যবহারকারীর নাম স্ট্রিংয়ে এর বিষয়বস্তু পড়ার দ্বারা উত্পন্ন ত্রুটিগুলি প্রচার করতে।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

ত্রুটিগুলি প্রচার করতে `File::open(...)` এবং after`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:: প্রদর্শন বৈশিষ্ট্যটি প্রয়োগ করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

`fmt`পদ্ধতির ভিতরে`struct CustomError;`ঘোষণা করুন এবং`write!(f, "Si e verificato un errore personalizzato") লিখে ডিসপ্লে প্রয়োগ করুন।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ