This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision | |||
|
cpp:exception_rethrow [2020/05/16 19:12] |
cpp:exception_rethrow [2020/05/16 20:12] gthanos |
||
|---|---|---|---|
| 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< | ||
| + | in >> str; | ||
| + | red = (unsigned char) atoi(str.c_str()); | ||
| + | in >> str; | ||
| + | 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:: | ||
| + | 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]); | ||
| + | delete imgptr; | ||
| + | } | ||
| + | catch(ios_base:: | ||
| + | cerr << "File '" | ||
| + | } | ||
| + | catch(bad_alloc &ex) { | ||
| + | cerr << " | ||
| + | if (imgptr!=nullptr) { | ||
| + | cerr << " | ||
| + | delete imgptr; | ||
| + | } | ||
| + | else | ||
| + | cerr << " | ||
| + | } | ||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | Από τον παραπάνω κώδικα μπορούμε να συμπεράνουμε ότι εφόσον παράγεται ένα // | ||
| + | ===== Παραλλαγή του παραπάνω παραδείγματος ===== | ||
| + | |||
| + | Στο προηγούμενο παράδειγμα κάντε την εξής αλλαγή. Αντικαταστήστε το //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; | ||
| + | } | ||
| + | </ | ||