بلوک try-catch در C++ برای مدیریت استثناءها (Exceptions) استفاده میشود. این مکانیسم به شما اجازه میدهد که کدی را که ممکن است باعث خطا یا استثناء شود، در یک محیط کنترلشده اجرا کنید و در صورت وقوع خطا، برنامه به جای کرش کردن، بتواند به صورت کنترلشده به خطا واکنش نشان دهد.
ساختار کلی به این صورت است:
try: کدی که احتمال وقوع استثناء در آن وجود دارد، درون بلوک try قرار میگیرد.
catch: اگر استثنایی در بلوک try رخ دهد، اجرای آن متوقف شده و کنترل به بلوک catch مربوطه منتقل میشود. شما میتوانید چندین بلوک catch برای مدیریت انواع مختلف استثناءها داشته باشید.
#include <iostream>
#include <stdexcept> // برای std::runtime_error
int main() {
int numerator = 10;
int denominator = 0;
int result;
try {
if (denominator == 0) {
// پرتاب یک استثناء از نوع runtime_error
throw std::runtime_error("Error: Division by zero is not allowed.");
}
result = numerator / denominator;
std::cout << "Result: " << result << std::endl; // این خط اجرا نخواهد شد
}
catch (const std::runtime_error& e) {
// مدیریت استثناء
std::cerr << "Caught exception: " << e.what() << std::endl;
}
catch (...) {
// مدیریت هر استثناء دیگری که نوع آن مشخص نشده باشد (Catch-all)
std::cerr << "Caught an unknown exception." << std::endl;
}
std::cout << "Program continues execution." << std::endl;
return 0;
}
نکات کلیدی:
throw: کلمه کلیدی است که برای ایجاد (پرتاب کردن) یک استثناء استفاده میشود.
انواع استثناء: میتوانید انواع مختلفی از استثناءها را پرتاب و مدیریت کنید، مانند:
استثناءهای استاندارد کتابخانه (مانند std::out_of_range, std::invalid_argument).
کلاسهای استثناء سفارشی که از کلاس پایه std::exception ارثبری میکنند.
catch(...): این یک گیرنده عمومی است که هر نوع استثنایی را که قبلاً توسط گیرندههای خاص مدیریت نشده باشد، میگیرد. بهتر است این را همیشه به عنوان آخرین catch قرار دهید.
اجرای کد پس از خطا: پس از مدیریت موفقیتآمیز یک استثناء در بلوک catch، اجرای برنامه از ادامهی بلوک try-catch (بعد از آخرین catch) دنبال میشود، نه از ابتدای بلوک try.