User Tools

Site Tools


cpp:stack_unwinding

This is an old revision of the document!


Stack Unwinding

Κατά την δημιουργία ενός exception μέσα σε μία συνάρτηση ή σε ένα κατασκευαστή δεν είναι απαραίτητο ότι η διαχείριση του exception θα πρέπει να γίνει στην ίδια τη συνάρτηση ή τον καστασκευαστή. Η διαδικασία όνομάζεται stack unwinding και το παράδειγμα που ακολουθεί είναι εξαρειτικά διαφωτιστικό για το πως διαμορφώνεται το stack μετά από την διαχείριση μίας εξαίρεσης σε υψηλότερο επίπεδο.

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;
}

Το αποτέλεσμα που εκτυπώνεται στην οθόνη είναι το εξής:

Start main
Start F
Start FF
Start FFF
Start FFFF
FFFF throwing int literal exception
F caught int exception
End F
End main

H εξέλιξη του program stack στο παρακάτω πρόγραμμα δίνεται στο παρακάτω διάγραμμα. Παρατηρήστε ότι το exception παράγεται στη συνάρτηση FFFF(), αλλά “πιάνεται” στην F() πράγμα που συνεπάγεται την αυτόματη συρρίκνωση του stack στο επίπεδο της συνάρτησης F(). Μετά το “πιάσιμο” του exception, τα περιεχόμενα του stack για τις συναρτήσεις FFFF(), FFF()και FF() έχουν χαθεί.

cpp/stack_unwinding.1557130341.txt.gz · Last modified: 2019/05/06 07:12 (external edit)