User Tools

Site Tools


cpp:exception

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
Next revisionBoth sides next revision
cpp:exception [2018/05/20 15:02] – [Κλείσιμο ανοιχτών resources όταν συμβεί ένα exception] gthanoscpp:exception [2018/05/21 02:00] – [Ένα 2ο παράδειγμα] gthanos
Line 513: Line 513:
 Το ενδεικτικό αρχείο εισόδου είναι το παρακάτω: Το ενδεικτικό αρχείο εισόδου είναι το παρακάτω:
  
-<code 3x2.ppm>+<code cpp 3x2.ppm>
 P3 P3
 3 -2 255 3 -2 255
Line 537: Line 537:
  
 Το //exception std::bad_alloc// είναι απόγονος της κλάσης //std::exception// επομένως ο παραπάνω κώδικας θα πρέπει να δουλεύει σωστά και μετά την αλλαγή. Εν τούτοις παρατηρούμε ότι το πρόγραμμα αποτυγχάνει με ένα μήνυμα της μορφής Το //exception std::bad_alloc// είναι απόγονος της κλάσης //std::exception// επομένως ο παραπάνω κώδικας θα πρέπει να δουλεύει σωστά και μετά την αλλαγή. Εν τούτοις παρατηρούμε ότι το πρόγραμμα αποτυγχάνει με ένα μήνυμα της μορφής
-<code +<code
 +$> ./PPMImageSample 3x2.ppm  
 +std::bad_alloc occured! 
 +terminate called after throwing an instance of 'std::exception' 
 +  what():  std::exception 
 +Aborted (core dumped) 
 +</code> 
 + 
 +Ο λόγος που συμβαίνει το παραπάνω είναι ότι το όταν το //catch block// παράγει και πάλι το //exception//, παράγει ένα αντικείμενο της κλάσης //std::exception// αποκόπτοντας το τμήμα του αντικειμένου που αφορά την απόγονο κλάση //std::bad_alloc//. Στη συνέχεια ένα τέτοιο αντικείμενο δεν μπορεί να το "πιάσει" το //catch block// της συνάρτησης //main//. Εάν πρέπει να παράγεται το ίδιο //exception// πράγμα που ήταν αρχικά επιθυμητό ο κώδικας στο //catch block// του κατασκευαστή θα πρέπει να γραφεί όπως παρακάτω, ώστε να παράγει ως //exception// το ίδιο αντικείμενο που έγινε //catch//
 + 
 +<code cpp> 
 +    catch(std::exception &ex) { 
 +      cerr << "std::exception occured!\n"; 
 +      in.close(); 
 +      throw ex;       // rethrows the same exception object 
 +    } 
 +</code>
 ===== Δήλωση των εξαιρέσεων που παράγουν οι συναρτήσεις (exception specifiers) ===== ===== Δήλωση των εξαιρέσεων που παράγουν οι συναρτήσεις (exception specifiers) =====
  
cpp/exception.txt · Last modified: 2023/05/15 14:01 by gthanos