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 revisionPrevious revision
Next revision
Previous revision
cpp:exception_rethrow [2019/05/06 08:23] – [2ο παράδειγμα] gthanoscpp:exception_rethrow [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
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; +        in >> str; 
-          blue = (unsigned char) atoi(str.c_str()); +        red = (unsigned char) atoi(str.c_str()); 
-          raster[row][col] = 0; +        in >> str; 
-          raster[row][col] = (red << 16) | (green << 8) | blue; +        green = (unsigned char) atoi(str.c_str()); 
-        }+        in >> 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.1557131031.txt.gz · Last modified: 2019/05/06 07:23 (external edit)