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
cpp:exception_rethrow [2019/05/06 08:41]
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 72: Line 75:
   }   }
   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) {
     cerr << "Memory allocation failure!\n";     cerr << "Memory allocation failure!\n";
-    if (imgptr!=nullptr) {+    if (imgptr!=nullptr)
       cerr << "imgptr != nullptr\n";       cerr << "imgptr != nullptr\n";
-      if(imgptr->getRaster() != nullptr) { +    else
-        cerr << "imgptr->getRaster() != nullptr\n"; +
-        delete imgptr->getRaster(); +
-      } +
-      else +
-        cerr << "imgptr->getRaster() == nullptr\n"; +
-      } +
-      delete imgptr; +
-    } +
-    else {+
       cerr << "imgptr == nullptr\n";       cerr << "imgptr == nullptr\n";
-    } 
   }   }
   delete imgptr;   delete imgptr;
Line 109: Line 102:
   - Εάν εφαρμόσω τον τελεστή **delete** σε ένα δείκτη που έχει την τιμή **nullptr**, δεν παράγεται κάποιου είδους //exception//, αλλά ο κώδικας συνεχίζει κανονικά.   - Εάν εφαρμόσω τον τελεστή **delete** σε ένα δείκτη που έχει την τιμή **nullptr**, δεν παράγεται κάποιου είδους //exception//, αλλά ο κώδικας συνεχίζει κανονικά.
  
-===== 2ο παράδειγμα =====+===== Παραλλαγή του παραπάνω παραδείγματος =====
  
 Στο προηγούμενο παράδειγμα κάντε την εξής αλλαγή. Αντικαταστήστε το //catch block// στον κατασκευαστή με το παρακάτω: Στο προηγούμενο παράδειγμα κάντε την εξής αλλαγή. Αντικαταστήστε το //catch block// στον κατασκευαστή με το παρακάτω:
Line 124: Line 117:
 <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)