Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

در مورد Panicها

Rust خطاهای مهلک را با “panic” کنترل می‌کند.

اگر یک خطای مرگبار در زمان اجرا رخ دهد، Rust باعث panic می‌شود:

fn main() {
    let v = vec![10, 20, 30];
    println!("v[100]: {}", v[100]);
}
  • استفاده از Panicها برای خطاهای غیر قابل جبران و غیرمنتظره است.
    • پانیک‌ها علائم باگ در برنامه هستند.
    • خرابی‌های زمان اجرا مانند failed bounds checkها می‌تواند باعث panic شود
    • Assertions (such as assert!) panic on failure
    • پنیک‌های خاص می‌توانند از ماکرو panic! استفاده کنند.
  • یک panic را “باز” ​​می‌کند و مقادیر را حذف می‌کند درست مثل اینکه توابع برگشته باشند.
  • اگر خرابی قابل قبول نیست، از APIهای بدون panic (مانند Vec::get) استفاده کنید.
This slide should take about 3 minutes.

به طور پیش‌فرض، panic باعث unwind شدن stack می‌شود. unwinding را می‌توان گرفت( در واقع منظور این است که می‌توان آن را caught کرد):

use std::panic;

fn main() {
    let result = panic::catch_unwind(|| "اینجا مشکلی نیست!");
    println!("{result:?}");

    let result = panic::catch_unwind(|| {
        panic!("oh no!");
    });
    println!("{result:?}");
}
  • گرفتن (Catching) غیر معمول است. سعی نکنید exceptionها را با catch_unwind پیاده‌سازی کنید!
  • این کار می‌تواند در سرورهایی مفید باشد که حتی در صورت خراب شدن یک درخواست، باید به کار خود ادامه دهند.
  • اگر panic = 'abort' در Cargo.toml» شما تنظیم شده باشد، این مورد کار نمی‌کند.