در مورد 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» شما تنظیم شده باشد، این مورد کار نمی‌کند.