close
دانلود فیلم
بلاک های try-catch

بلاک های try-catch

مديريت استثنا بر اساس مفاهيمی که گفته شد توسط سه دستور try، catch و throw‌ عمل می کند. بلاک کدی می خواهيم استثناهای آن را بگيريم با دستور try مشخص می شود. درون بلاک می توان هر خطائی با دستور throw گير افتاده و از بين می رود. بلاک catch که محلی برای کد مديريت خطا است بلافاصله بعد از بلاک try قرار می گيرد.

فرم کلی به صورت زير است:

try {
   ...
   ...
   throw Exception;
   ...
   ...
   }
catch( Exception e ) {
   ...
   ...
   }


مثال. هر استثنائی که موقع دسترسی به فايل test.txt رخ دهد گرفته و پيغام مناسب نمايش داده می شود.

#include <fstream.h>
#include <iostream.h>
int main () {
   try {
      char buffer[256];
      ifstream myfile ("test.txt");
      while (! myfile.eof() ) {
         myfile.getline (buffer,100);
         cout << buffer << endl;
      }
   }
   catch(…) {
      cout << “There was an error !n”;
   }
   return 0;
}


سه نقطه درون پرانتز catch به معنی اینستکه کلیه خطاها توسط این بلاک مديريت می شود. می توان انواع مختلفی از خطاها را هندل کرد.

وقتی استثنائی رخ می دهد کنترل به بلاک catch منتقل می شود بنابراين دستورات بعد از throw اجرا نخواهد شد. در بلاک catch کد بايد به نحوی باشد که اجرای برنامه را به صورت معمول ادامه يابد يا در صورت برطرف نشدن خطا با exit يا abort خاتمه پيدا کند. اگر بلاک catch اجرای برنامه را به پايان نرساند کنترل اجرا به دستور بعد از بلاک try-catch منتقل می شود.

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


مثال. خطا در تابع گرفته می شود اما به برنامه اصلی برای مديريت ارسال می شود.

#include <iostream.h>
float divide_number(float , float);
int main() {
   float dividend,divisor,answer;
   try {
      cout << "Please enter a number n";
      cin >> dividend;
      cout << "Please enter a number n";
      cin >> divisor;
      answer = divide_number(dividend,divisor);
      cout << dividend << " divided by ";
      cout << divisor << " is " << answer;
      }
   catch(...) {
      cout << "oops, there is an error!";
      }
   return 1;
}
float divide_number(float num1, float num2) {
   try {
      float answer;
      answer = num1/num2;
      return answer;
      }
   catch(...) {
      throw;
   }
}


هر دستور try می تواند با چندين دستور catch در ارتباط باشد. هر کدام برای نوع مختلفی از استثنا. نوع داده ای که در دستور catch مشخص شده است با استثنای تطبيق داده می شود سپس بخش مربوطه به اجرا در می آيد و از بقيه صرفنظر می شود. هر نوع داده ای از جمله کلاس های تعريف شده در برنامه می تواند بدام انداخته شود.


مثال. اعداد صحیح توسط catch گرفته می شود. اگر تقسیم بر صفر باشد یک عدد صحیح به بلاک catch داده می شود. بلاک catch استثنا از نوع صحيح را می گيرد.

#include <iostream.h>
int main(){
   int answer, divisor, dividend;
   try {
      cout << "Please enter an integer n";
      cin >> divisor;
      cout << "Please enter another integer n";
      cin >> dividend;
      if(dividend ==0) throw 0;
      answer = divisor/dividend;
      cout << answer;
      return 0;
      }
   catch (int i) {
      cout << "You cannot divide by zero";
      }
}

مثال. کاربرد مديريت استثناها در استفاده از حافظه پويا.

try {
   NodePtr = new ListNodeClass(Item, NextPtr);
   if (NodePtr == NULL) {
      throw "Cannot allocate memory";
   }
   NodePtr = GetNode(Item, Front->Next);
   }
catch(char * Str) {
   cout << "Error: Could not insert at front " << Str << endl;
   throw;
   }

مثال. مديريت استثنا با چند بلاک catch.


try{
   cin >> test;
   if (test == 0 ) throw test;
   if (test == 1 ) throw 'a';
   if (test == 0 ) throw 123.5;
   }
catch(float FloatNum){
   cout << "Caught an exception with float value: " << FloatNum << endl;
   }
catch(int IntNum) {
   cout << "Caught an exception with int value: " << IntNum << endl;
   }
catch(...){ // catch anything else
   cout << "Caught an exception with type not int or float" << endl;
   }


وقتی چندین خطا را پاسخ می دهید سلسله مراتب خطاها اهمیت دارد. خطاها با ترتیبی که در سلسله مراتب نشان داده شده است باید در تله انداخته شوند یعنی اگر شما run-time-error را گیر انداختید نمی توانید عبارت catch دیگری برای file access error داشته باشید چون خطاهائی که در سلسله مراتب بالاتر هستند کلیه خطاهای پایینی را در بر دارند.

Exception – the parent class for all exception class
   Login-error – the parent class of a variety of logic error
      invalid-argumet
      out-of-range
   Runtime-error – the parent of class for a variety of rumtime error
      overflow-error
      FileAccessError
      range-error

لینک کوتاه پست
مطالب مرتبط با پست جاری
  • نکات مهم
    1- لطفا نظر خود را با زبان فارسی بیان کنید
    2- رایتم نظرات اسپم و تبلیغی شما را تایید نمی کند
    3- لطفا نظرات شما بدون ابهام و واضح باشد
  • نام
    ایمیل (منتشر نمی‌شود) (لازم)
    وبسایت
    :):(;):D;)):X:?:P:*=((:O@};-:B/:):S
    نظر خصوصی
    مشخصات شما ذخیره شود ؟[حذف مشخصات] [شکلک ها]
    کد امنیتی
به کانال تلگرام سایت ما بپیوندید