اداره کردن استثناء ها در c++ چگونه هست و به چه معناست؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

اداره کردن استثناء ها در c++ چگونه هست و به چه معناست؟

+2 امتیاز

با سلام.

منظور از اداره کردن استثناء چیه؟ (البته خودم تا حدودی فهمیدم برای چیه ، مثلا یکی از این موارد تقسیم بر صفر هست) و چجوری و کجا ازش استفاده میشه؟

حالا دوتا بلوک برای این کار داریم ،

try {
بدنه بلوک 
}

و 

catch (پارامتر) {
بدنه بلوک 
{

این دوتا چی هستند ؟

اگه یه توضیح بدید و یه مثال کوچیک و ابتدایی ، خیلی ممنونتون میشم.

 

با تشکر.

سوال شده مهر 6, 1393  بوسیله ی hosseinam1370 (امتیاز 163)   8 22 34

1 پاسخ

+3 امتیاز
 
بهترین پاسخ

جاهایی از مدیریت استثنا استفاده میشه که برنامه با کاربر نعامل داره و ممکنه ورودی که کاربر وارد می کنه درست نباشه چون اگر الگوریتم های برنامتون روی ورودی اشتباه انجام بشن برنامه جواب درستی نمیده و هم این که این جور جاها لازمه که  ارور درستی رو به کاربر نمایش هم بدید .

 

3 تا کلمه کلیدی برای این کار  داریم throw , try , catch

  • throw یک استثنا رو بر می گردونه
  • try یک بلاک تعریف می کنه که تعریف ها و متغیر های داخلش چک میشن که آیا چیزی throw شده یا نه( استثنا برگشت داده شده یا خیر)
  • catch هم یک بلاک تعریف می کنه که درصورتی که استثنا داخل بلاک try برگشت داده شده باشه بلاک مربوط بهش اجرا میشه.

 

داخل ++C شما میتونین هر نوعی رو throw کنید ولی اصولا بهتره یک کلاس از std::exception ارث ببرید و اون رو بر گردونید .

 

مثال :

فرض کنید یک قسمت از برنامه یک آدرس اینترنت می گیره از کاربر و اون صفحه رو دانلود می کنه حالا اگر صفحه که کاربر میده آدرس صحیحی نباشه طبیعتا برنامه هم نمی تونه چیزی دانلود کنه  و باید ارور مربوطه رو بده .

#include <iostream>
#include <exception>

class BadUrl:public std::exception
{
    const char* what() const  {return "url is not correct!\n";}
};

struct Page
{
    std::string data;
};

Page download(const std::string& address)
{
    if(address.size()==0)
        throw BadUrl();

    Page page;
    page.data="blah blah...";
    return page;
}


int main()
{
    try{//code haye dakhele in block check mishan
        download("");
    }
    //khat zir exception hayee ke az class std::exception ers bordan ro migire
    catch(std::exception& exc){
        std::cout<< exc.what();//url is not correct chap mishe
    }
    //dar soorat bargardoondan exception ee
    //ke az std::exception ers naborde bashe
    //khat zir ejra mishe
    catch(...){
        std::cout<<"undefined error...";
    }
}

http://ideone.com/PaO9Lx

 

پاسخ داده شده مهر 6, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد مهر 6, 1393 بوسیله ی hosseinam1370
ممنون از پاسختون.
یعنی منظورتون اینه که throw شبیه goto عمل میکنه؟
از نظر مفهومی آره مثل هم هستن .
...