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 revisionBoth sides next revision
cpp:exception [2019/05/06 07:17] – [Κληρονομικότητα εξαιρέσεων] gthanoscpp:exception [2019/05/06 07:19] – [Stack Unwinding] gthanos
Line 205: Line 205:
  
  
-===== Stack Unwinding ===== 
- 
-Κατά την δημιουργία ενός //exception// μέσα σε μία συνάρτηση ή σε ένα κατασκευαστή δεν είναι απαραίτητο ότι η διαχείριση του //exception// θα πρέπει να γίνει στην ίδια τη συνάρτηση ή τον καστασκευαστή. Η διαδικασία όνομάζεται //stack unwinding// και το παράδειγμα που ακολουθεί είναι εξαρειτικά διαφωτιστικό για το πως διαμορφώνεται το stack μετά από την διαχείριση μίας εξαίρεσης σε υψηλότερο επίπεδο. 
- 
-<code cpp StackUnwinding.cpp> 
-#include <iostream> 
-// called by FFF() 
-void FFFF() { 
-  std::cout << "Start FFFF\n"; 
-  std::cout << "FFFF throwing int literal exception\n"; 
-  throw 100; 
-  std::cout << "End FFFF\n"; 
-  
-} 
-// called by FF()  
-void FFF() { 
-  std::cout << "Start FFF\n"; 
-  FFFF(); 
-  std::cout << "End FFF\n"; 
-} 
-// called by F() 
-void FF() { 
-  std::cout << "Start FF\n"; 
-  try { 
-    FFF(); 
-  } catch(char) {  
-    std::cerr << "FF caught double exception\n"; 
-  } 
-  std::cout << "End FF\n"; 
-} 
-// called by main() 
-void F() { 
-  std::cout << "Start F\n"; 
-  try { 
-    FF(); 
-  } catch (int) { 
-     std::cerr << "F caught int exception\n"; 
-  } catch (char) { 
-     std::cerr << "F caught double exception\n"; 
-  } 
-  std::cout << "End F\n"; 
-} 
-  
-int main() { 
-  std::cout << "Start main\n"; 
-  try { 
-    F(); 
-  } catch (int) { 
-    std::cerr << "main caught int exception\n"; 
-  } 
-  std::cout << "End main\n";  
-  return 0; 
-} 
-</code> 
- 
-Το αποτέλεσμα που εκτυπώνεται στην οθόνη είναι το εξής: 
-<code> 
-Start main 
-Start F 
-Start FF 
-Start FFF 
-Start FFFF 
-FFFF throwing int literal exception 
-F caught int exception 
-End F 
-End main 
-</code> 
- 
-H εξέλιξη του //program stack// στο παρακάτω πρόγραμμα δίνεται στο παρακάτω διάγραμμα. Παρατηρήστε ότι το exception παράγεται στη συνάρτηση **FFFF()**, αλλά "πιάνεται" στην **F()** πράγμα που συνεπάγεται την αυτόματη συρρίκνωση του //stack// στο επίπεδο της συνάρτησης **F()**. Μετά το "πιάσιμο" του //exception//, τα περιεχόμενα του //stack// για τις συναρτήσεις **FFF()** και **FFFF()** έχουν χαθεί. 
- 
-{{ :cpp:stack_unwinding.png |}} 
  
 ===== Διαχείριση μίας εξαίρεσης και παραγωγή νέας εξαίρεσης κατά την διαχείριση της ===== ===== Διαχείριση μίας εξαίρεσης και παραγωγή νέας εξαίρεσης κατά την διαχείριση της =====
cpp/exception.txt · Last modified: 2023/05/15 14:01 by gthanos