This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
cpp:exception_rethrow [2019/05/06 08:41] gthanos [Διαχείριση εξαίρεσης και παραγωγή νέας εξαίρεσης κατά τη διαχείριση της] |
cpp:exception_rethrow [2020/05/16 19:12] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Διαχείριση εξαίρεσης και παραγωγή νέας εξαίρεσης κατά τη διαχείριση της ====== | ||
| - | Κάποιες φορές είναι επιθυμητό να διαχειριστούμε μία εξαίρεση προκειμένου να κλείσουμε περιγραφείς αρχείων, | ||
| - | |||
| - | Δεν θέλουμε να διαχειριστούμε την εξαίρεση μέσα στον κατασκευαστή, | ||
| - | |||
| - | <code cpp PPMImageSample.cpp> | ||
| - | #include < | ||
| - | #include < | ||
| - | #include <ios> | ||
| - | #include < | ||
| - | |||
| - | using namespace std; | ||
| - | |||
| - | class PPMImage { | ||
| - | int width, height, colordepth; | ||
| - | int **raster; | ||
| - | public: | ||
| - | PPMImage(char *filename); | ||
| - | ~PPMImage(); | ||
| - | }; | ||
| - | |||
| - | PPMImage:: | ||
| - | string str; | ||
| - | unsigned char red, green, blue; | ||
| - | ifstream in(filename); | ||
| - | if(!in.is_open()) { | ||
| - | std:: | ||
| - | throw fex; | ||
| - | } | ||
| - | try { | ||
| - | in >> str; | ||
| - | in >> str; | ||
| - | width = atoi(str.c_str()); | ||
| - | in >> str; | ||
| - | height = atoi(str.c_str()); | ||
| - | in >> str; | ||
| - | colordepth = atoi(str.c_str()); | ||
| - | raster = new int*[height]; | ||
| - | for(int row=0; row< | ||
| - | raster[row] = new int[width]; | ||
| - | for(int row=0; row< | ||
| - | for(int col=0; col< | ||
| - | cin >> str; | ||
| - | red = (unsigned char) atoi(str.c_str()); | ||
| - | cin >> str; | ||
| - | 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:: | ||
| - | cerr << " | ||
| - | in.close(); | ||
| - | throw ex; | ||
| - | } | ||
| - | } | ||
| - | | ||
| - | PPMImage:: | ||
| - | if(raster == nullptr) | ||
| - | return; | ||
| - | for(int row=0; row< | ||
| - | delete raster[row]; | ||
| - | delete raster; | ||
| - | raster = nullptr; | ||
| - | } | ||
| - | |||
| - | int main(int argc, char *argv[]) { | ||
| - | PPMImage *imgptr=nullptr; | ||
| - | try{ | ||
| - | imgptr = new PPMImage(argv[1]); | ||
| - | } | ||
| - | catch(ios_base:: | ||
| - | cerr << "File '" | ||
| - | } | ||
| - | catch(bad_alloc &ex) { | ||
| - | cerr << " | ||
| - | if (imgptr!=nullptr) | ||
| - | cerr << " | ||
| - | else | ||
| - | cerr << " | ||
| - | } | ||
| - | delete imgptr; | ||
| - | return 0; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Το ενδεικτικό αρχείο εισόδου είναι το παρακάτω: | ||
| - | |||
| - | <code cpp 3x2.ppm> | ||
| - | P3 | ||
| - | 3 -2 255 | ||
| - | 255 0 0 255 255 0 0 255 255 | ||
| - | 255 0 255 0 255 0 128 128 128 | ||
| - | </ | ||
| - | |||
| - | Από τον παραπάνω κώδικα μπορούμε να συμπεράνουμε τα εξής: | ||
| - | - Εφόσον παράγεται ένα // | ||
| - | - Εάν εφαρμόσω τον τελεστή **delete** σε ένα δείκτη που έχει την τιμή **nullptr**, | ||
| - | |||
| - | ===== Παραλλαγή του παραπάνω παραδείγματος ===== | ||
| - | |||
| - | Στο προηγούμενο παράδειγμα κάντε την εξής αλλαγή. Αντικαταστήστε το //catch block// στον κατασκευαστή με το παρακάτω: | ||
| - | |||
| - | <code cpp> | ||
| - | catch(std:: | ||
| - | cerr << " | ||
| - | in.close(); | ||
| - | throw ex; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Το //exception std:: | ||
| - | < | ||
| - | $> ./ | ||
| - | std:: | ||
| - | terminate called after throwing an instance of ' | ||
| - | what(): | ||
| - | Aborted (core dumped) | ||
| - | </ | ||
| - | |||
| - | Ο λόγος που συμβαίνει το παραπάνω είναι ότι το όταν το //catch block// παράγει και πάλι το // | ||
| - | |||
| - | <code cpp> | ||
| - | catch(std:: | ||
| - | cerr << " | ||
| - | in.close(); | ||
| - | throw; | ||
| - | } | ||
| - | </ | ||