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