User Tools

Site Tools


cpp:exception_rethrow

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
cpp:exception_rethrow [2019/05/06 08:23]
gthanos [2ο παράδειγμα]
cpp:exception_rethrow [2020/05/05 10:08]
gthanos [Διαχείριση εξαίρεσης και παραγωγή νέας εξαίρεσης κατά τη διαχείριση της]
Line 17: Line 17:
   int **raster;   int **raster;
 public: public:
-  PPMImage(char *filename) { +  PPMImage(char *filename); 
-    string str; +  ~PPMImage(); 
-    unsigned char red, green, blue; +}; 
-    ifstream in(filename); + 
-    if(!in.is_open()) { +PPMImage::PPMImage(char *filename) { 
-      std::ios_base::failure fex("File not found!"); +  string str; 
-      throw fex; +  unsigned char red, green, blue; 
-    +  ifstream in(filename); 
-    try { +  if(!in.is_open()) { 
-      in >> str; +    std::ios_base::failure fex("File not found!"); 
-      in >> str; +    throw fex; 
-      width = atoi(str.c_str()); +  
-      in >> str; +  try { 
-      height = atoi(str.c_str()); +    in >> str; 
-      in >> str; +    in >> str; 
-      colordepth = atoi(str.c_str()); +    width = atoi(str.c_str()); 
-      raster = new int*[height]; +    in >> str; 
-      for(int row=0; row<height; row++) +    height = atoi(str.c_str()); 
-        raster[row] = new int[width]; +    in >> str; 
-      for(int row=0; row<height; row++) { +    colordepth = atoi(str.c_str()); 
-        for(int col=0; col<width; col++) { +    raster = new int*[height]; 
-          cin >> str; +    for(int row=0; row<height; row++) 
-          red = (unsigned char) atoi(str.c_str()); +      raster[row] = new int[width]; 
-          cin >> str; +    for(int row=0; row<height; row++) { 
-          green = (unsigned char) atoi(str.c_str()); +      for(int col=0; col<width; col++) { 
-          cin >> str; +        cin >> str; 
-          blue = (unsigned char) atoi(str.c_str()); +        red = (unsigned char) atoi(str.c_str()); 
-          raster[row][col] = 0; +        cin >> str; 
-          raster[row][col] = (red << 16) | (green << 8) | blue; +        green = (unsigned char) atoi(str.c_str()); 
-        }+        cin >> str; 
 +        blue = (unsigned char) atoi(str.c_str()); 
 +        raster[row][col] = 0; 
 +        raster[row][col] = (red << 16) | (green << 8) | blue;
       }       }
-    } 
-    catch(std::bad_alloc &ex) { 
-      cerr << "std::bad_alloc occured!\n"; 
-      in.close(); 
-      throw ex; 
     }     }
   }   }
-   +  catch(std::bad_alloc &ex) { 
-  ~PPMImage() { +    cerr << "std::bad_alloc occured!\n"
-    for(int row=0; row<heightrow++) +    in.close()
-      delete raster[row]+    throw ex;
-    delete raster;+
   }   }
 +}
      
-  int **getRaster() { return raster; } +PPMImage::~PPMImage() { 
-   +  if(raster == nullptr) 
-};+    return
 +  for(int row=0; row<height; row++) 
 +    delete raster[row]
 +  delete raster; 
 +  raster = nullptr; 
 +}
  
 int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
Line 70: Line 73:
   try{   try{
     imgptr = new PPMImage(argv[1]);     imgptr = new PPMImage(argv[1]);
 +    delete imgptr;
   }   }
   catch(ios_base::failure &fex) {   catch(ios_base::failure &fex) {
-    cerr << "File '" << argv[0] << "' was not found!\n";+    cerr << "File '" << argv[1] << "' was not found!\n";
   }   }
   catch(bad_alloc &ex) {   catch(bad_alloc &ex) {
Line 78: Line 82:
     if (imgptr!=nullptr) {     if (imgptr!=nullptr) {
       cerr << "imgptr != nullptr\n";       cerr << "imgptr != nullptr\n";
-      if(imgptr->getRaster() != nullptr) { 
-        cerr << "imgptr->getRaster() != nullptr\n"; 
-        delete imgptr->getRaster(); 
-      } 
-      else { 
-        cerr << "imgptr->getRaster() == nullptr\n"; 
-      } 
       delete imgptr;       delete imgptr;
     }     }
-    else {+    else
       cerr << "imgptr == nullptr\n";       cerr << "imgptr == nullptr\n";
-    } 
   }   }
-  delete imgptr; 
   return 0;   return 0;
 } }
Line 105: Line 100:
 </code> </code>
  
-Από τον παραπάνω κώδικα μπορούμε να συμπεράνουμε τα εξής: +Από τον παραπάνω κώδικα μπορούμε να συμπεράνουμε ότι εφόσον παράγεται ένα //exception// o δείκτης //imgptr// μέσα στο //catch block// της συνάρτησης //main// έχει την αρχική του τιμή, δηλαδή **nullptr**. Αυτό είναι λογικό με βάση τις αρχές του //stack unwinding// που συζητήσαμε προηγούμενα.
-  - Εφόσον παράγεται ένα //exception// o δείκτης //imgptr// μέσα στο //catch block// της συνάρτησης //main// έχει την αρχική του τιμή, δηλαδή **nullptr**. Αυτό είναι λογικό με βάση τις αρχές του //stack unwinding// που συζητήσαμε προηγούμενα. +
-  - Εάν εφαρμόσω τον τελεστή **delete** σε ένα δείκτη που έχει την τιμή **nullptr**, δεν παράγεται κάποιου είδους //exception//, αλλά ο κώδικας συνεχίζει κανονικά. +
 ===== Παραλλαγή του παραπάνω παραδείγματος ===== ===== Παραλλαγή του παραπάνω παραδείγματος =====
  
Line 124: Line 116:
 <code> <code>
 $> ./PPMImageSample 3x2.ppm  $> ./PPMImageSample 3x2.ppm 
-std::bad_alloc occured!+std::exception occured!
 terminate called after throwing an instance of 'std::exception' terminate called after throwing an instance of 'std::exception'
   what():  std::exception   what():  std::exception
cpp/exception_rethrow.txt · Last modified: 2020/05/16 19:12 (external edit)