ট্র্যাক
/
Cairo
Cairo
/
সিলেবাস
/
এরর হ্যান্ডলিং
এর

এরর হ্যান্ডলিং মধ্যে Cairo

১টি অনুশীলনী

এরর হ্যান্ডলিং সম্পর্কে

Cairo সমস্যা মোকাবিলা ও এরর সামলানোর জন্য এরর হ্যান্ডলিং কৌশল দেয়, যাতে কোড নির্বাহের সময় মসৃণভাবে চালানো যায়।

Cairo-তে দুই ধরনের এরর আছে:

  • panic দিয়ে যেসব এরর সামলানো যায় না: এই এররগুলো সাথে সাথে প্রোগ্রাম বন্ধ করে দেয়।
  • Result দিয়ে যেসব এরর সামলানো যায়: রানটাইমে এই এররগুলো সামলানো যায়।

panic দিয়ে যেসব এরর সামলানো যায় না

Cairo-তে প্রোগ্রাম চালানোর সময় অপ্রত্যাশিত সমস্যা দেখা দিতে পারে, যার ফলে রানটাইম এরর হয়, যাকে "panic" বলা হয়। এতে প্রোগ্রাম চলা থেমে যায়, যা সেই ক্ষেত্রে সহায়ক যেখানে চালিয়ে যাওয়ার কোনো মানে হয় না। একটি panic ঘটতে পারে অনিচ্ছাকৃতভাবে, কোডকে panic করানো এমন কাজের মাধ্যমে (যেমন, অ্যারের সীমার বাইরে গিয়ে অ্যাক্সেস করা), অথবা ইচ্ছাকৃতভাবে, panic ফাংশন কল করে।

fn main() {
    let data = array![1, 2];

    if true {
        panic(data);
    }
    println!("This line will not be reached.");
}

এই উদাহরণটি চালালে কনসোলে নিচের লেখাটি ছাপা হবে:

Run panicked with [1, 2, ].

আরও একটি বিশেষ ম্যাক্রো আছে, যার নাম panic!, যা এরর মেসেজ হিসেবে একটি ByteArray ব্যবহার করার সুযোগ দেয়।

panic!("The error for the panic! Error message is not limited to 31 characters anymore");

assert! ম্যাক্রো

assert! ম্যাক্রো আপনার কোডে নির্দিষ্ট শর্ত কার্যকর করার একটি দরকারি হাতিয়ার। assert!-এর শর্তটি যদি false হিসেবে মূল্যায়িত হয়, তাহলে প্রোগ্রামটি একটি ByteArray এরর মেসেজ নিয়ে panic করবে। ডেভেলপমেন্টের সময় অনুমান যাচাই করতে এবং মানগুলো নির্দিষ্ট মাপকাঠি পূরণ করে কি না নিশ্চিত করতে এটি প্রায়ই ব্যবহৃত হয়।

যেমন:

fn main() {
    let x = 5;
    assert!(x > 0, "x must be greater than zero");
}

x যদি শূন্যের চেয়ে বড় না হয়, তবে প্রোগ্রামটি "x must be greater than zero" মেসেজ দিয়ে panic করবে। হাতে করে এরর হ্যান্ডলিং কোড না লিখেই ইনভেরিয়েন্ট ও প্রিকন্ডিশন যাচাই করার জন্য assert! সহায়ক।

nopanic নোটেশন

Cairo-র nopanic নোটেশন বোঝায় যে একটি ফাংশন কখনোই panic করবে না।

fn function_never_panic() -> felt252 nopanic {
    108
}

একটি nopanic ফাংশন শুধু সেই ফাংশন থেকেই কল করা যায়, যেটিও nopanic হিসেবে অ্যানোটেট করা।

panic_with অ্যাট্রিবিউট

Cairo-র panic_with অ্যাট্রিবিউট এমন একটি ফাংশন চিহ্নিত করে যা Option বা Result রিটার্ন করে, এবং আপনার অ্যানোটেট করা ফাংশনের জন্য একটি র‍্যাপার তৈরি করে, যা ফাংশনটি Option::None বা Result::Err রিটার্ন করলে panic করবে।

#[panic_with('value is 0', wrap_not_zero)]
fn check_not_zero(value: u128) -> Option<u128> {
    if value == 0 {
        Option::None
    } else {
        Option::Some(value)
    }
}

fn main() {
    check_not_zero(0); // -> returns Option::None
    wrap_not_zero(0);  // -> panics with 'value is 0'
}

Result দিয়ে যেসব এরর সামলানো যায়

Result এনাম এররগুলো সুন্দরভাবে সামলায়, ক্র্যাশ বা অনির্ধারিত আচরণ তৈরি করার বদলে ফিডব্যাক দেয়।

enum Result<T, E> {
    Ok: T,
    Err: E,
}

চলুন একটি উদাহরণ দেখি, যেখানে এই এনাম ব্যবহার করে শূন্য দিয়ে ভাগ করার সমস্যা সামলানো যায়:

fn divide(a: u32, b: u32) -> Result<u32, ByteArray> {
    if b == 0 {
        return Result::Err("Error: Division by zero"); // Return an error if division by zero is attempted
    }
    Result::Ok(a / b)
}

fn main() {
    // Test with division by zero
    match divide(10, 0) {
        Result::Ok(result) => println!("Division successful: {}", result),
        Result::Err(e) => println!("{}", e),
    }
}

? অপারেটর

? অপারেটর সংক্ষিপ্ত ও অন্তর্নিহিত এরর হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়, যা কল করা ফাংশনকে সম্ভাব্য যেকোনো এরর সামলানোর সুযোগ দেয়। আপনি যখন Result বা Option টাইপে ? অপারেটর ব্যবহার করেন, তখন এটি নিচের কাজটি করে:

  • মানটি যদি Result::Ok(x) বা Option::Some(x) হয়, তবে এটি ভেতরের মান x সরাসরি রিটার্ন করে।
  • মানটি যদি Result::Err(e) বা Option::None হয়, তবে এটি ফাংশন থেকে সাথে সাথে রিটার্ন করে এরর বা None ছড়িয়ে দেয়।
fn parse_u8(s: felt252) -> Result<u8, felt252> {
    match s.try_into() {
        Option::Some(value) => Result::Ok(value),
        Option::None => Result::Err('Invalid integer'),
    }
}

fn do_something_with_parse_u8(input: felt252) -> Result<u8, felt252> {
    let input_to_u8: u8 = parse_u8(input)?;
    // DO SOMETHING
    let res = input_to_u8 - 1;
    Result::Ok(res)
}

fn main() {
    let number: felt252 = 258;
    match do_something_with_parse_u8(number) {
        Result::Ok(value) => println!("Result: {}", value),
        Result::Err(e) => println!("Error: {}", e),
    }
}
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে

এরর হ্যান্ডলিং শিখুন

অনুশীলন লক করা আছে

এরর হ্যান্ডলিং অনুশীলন করতে আরও ১টি অনুশীলনী আনলক করুন