1404_book_u5

23
1 ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ Προγράμματα Συμπληρωματικής Εκπαίδευσης Με τη χρήση καινοτόμων μεθόδων εξ αποστάσεως εκπαίδευσης 1404 - ΕΙΣΑΓΩΓΗ ΣΤΗ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ PYTHON

description

SADV

Transcript of 1404_book_u5

Page 1: 1404_book_u5

1

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ

Προγράμματα Συμπληρωματικής Εκπαίδευσης

Με τη χρήση καινοτόμων μεθόδων εξ αποστάσεως εκπαίδευσης

1404 - ΕΙΣΑΓΩΓΗ ΣΤΗ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ PYTHON

Page 2: 1404_book_u5

2

© Copyright 2015, Εθνικό και Καποδιστριακό Πανεπιστήμιο Αθηνών, Π. Ε. Πετράκης.

Η έντυπη, ηλεκτρονική και γενικά κατά οποιοδήποτε τρόπο αναπαραγωγή, δημοσίευση

ή χρησιμοποίηση όλου ή μέρους του υλικού έργου αυτού, απαγορεύεται χωρίς την

έγγραφη έγκριση του κατόχου των πνευματικών δικαιωμάτων του έργου.

Page 3: 1404_book_u5

3

Το παρόν έντυπο αποτελεί τμήμα του εκπαιδευτικού υλικού του μαθήματος “Εισαγωγή

στη Γλώσσα Προγραμματισμού Python”. Αποτελεί απαραίτητο συμπλήρωμα του

ηλεκτρονικού υλικού που βρίσκεται στην πλατφόρμα και αναπόσπαστο κομμάτι της

εκπαιδευτικής διαδικασίας.

Στην πέμπτη διδακτική ενότητα, οι εκπαιδευόμενοι θα γνωρίσουν τις βασικές αρχές για

τη δημιουργία προγραμμάτων σε Python, καθώς και τη χρήση αρχείων και εξαιρέσεων.

Επίσης, θα εξοικειωθούν με τη συγγραφή απλών προγραμμάτων και σεναρίων σε

αυτά τα αντικείμενα. Για το λόγο αυτό, παρουσιάζονται τα βασικά στοιχεία με απλά

παραδείγματα προς εκτέλεση από τους εκπαιδευόμενους.

Τη συγγραφή του συγκεκριμένου εκπαιδευτικού υλικού πραγματοποίησε ο κ.

Ρηγόπουλος Γιώργος, εξωτερικός συνεργάτης του Προγράμματος Συμπληρωματικής

εξ Αποστάσεως Εκπαίδευσης του Εθνικού και Καποδιστριακού Πανεπιστημίου Αθηνών.

Page 4: 1404_book_u5

4

Π Ε Ρ Ι Ε Χ Ο Μ Ε Ν Α

ΔΙΔΑΚΤΙΚΗ ΕΝΟΤΗΤΑ 5. ΠΡΟΓΡΑΜΜΑΤΑ – ΑΡΧΕΙΑ – ΕΞΑΙΡΕΣΕΙΣ .......................................... 5 ΕΙΣΑΓΩΓΙΚΕΣ ΠΑΡΑΤΗΡΗΣΕΙΣ ..................................................................................................... 7

ΥΠΟΕΝΟΤΗΤΑ 1. ΠΡΟΓΡΑΜΜΑΤΑ ΚΑΙ ΑΡΧΕΙΑ ................................................................. 8 ΥΠΟΕΝΟΤΗΤΑ 2. ΕΞΑΙΡΕΣΕΙΣ ............................................................................................. 13 ΣΥΝΟΨΗ .............................................................................................................................. 22 ΒΙΒΛΙΟΓΡΑΦΙΑ ................................................................................................................... 23

Page 5: 1404_book_u5

5

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ

Προγράμματα Συμπληρωματικής Εκπαίδευσης

Με τη χρήση καινοτόμων μεθόδων εξ αποστάσεως εκπαίδευσης

1404 - ΕΙΣΑΓΩΓΗ ΣΤΗ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ PYTHON

ΔΙΔΑΚΤΙΚΗ ΕΝΟΤΗΤΑ 5. ΠΡΟΓΡΑΜΜΑΤΑ – ΑΡΧΕΙΑ – ΕΞΑΙΡΕΣΕΙΣ

Page 6: 1404_book_u5

6

Page 7: 1404_book_u5

7

Εισαγωγικές Παρατηρήσεις Σε αυτή την ενότητα οι εκπαιδευόμενοι έρχονται σε επαφή με τη δημιουργία

προγραμμάτων με τη χρήση αρχείων τα οποία αποτελούν βασική γνώση για την

δημιουργία ολοκληρωμένων σεναρίων και προγραμμάτων. Επίσης παρουσιάζεται η

χρήση εξαιρέσεων για την εκσφαλμάτωση του κώδικα. Τα δύο θέματα είναι θεμελιώδη

τόσο για την συγγραφή όσο και για την κατανόηση ολοκληρωμένων προγραμμάτων.

Έτσι, στην πρώτη υποενότητα παρουσιάζονται οι βασικές αρχές για τον τρόπο

δημιουργίας προγραμμάτων σε Python με τη χρήση αρχείων και παρέχονται

παραδείγματα. Στη δεύτερη υποενότητα παρουσιάζονται τα βασικά στοιχεία της

διαχείρισης εξαιρέσεων από την Python με παραδείγματα για κατανόηση και εκτέλεση

από τους εκπαιδευόμενους.

Page 8: 1404_book_u5

8

ΥΠΟΕΝΟΤΗΤΑ 1. ΠΡΟΓΡΑΜΜΑΤΑ ΚΑΙ ΑΡΧΕΙΑ

Στα πλαίσια της υποενότητας αυτής θα παρουσιαστεί η διαδικασία για τη δημιουργία

ολοκληρωμένων προγραμμάτων στην Python. Θα παρουσιαστούν και θα αναλυθούν

τα βασικά στοιχεία ενός προγράμματος Python με τη χρήση αρχείων και θα δοθούν

σχετικά παραδείγματα.

1.1 Βασικά στοιχεία ενός προγράμματος Python

Έως αυτό το σημείο τα παραδείγματα που έχουν παρουσιαστεί χρησιμοποιούν τον

διερμηνευτή της Python σε διαδραστικό περιβάλλον. Αυτό είναι επαρκές και εξυπηρετεί

για τα συγκεκριμένα παραδείγματα, τα οποία περιλαμβάνουν μερικές γραμμές εντολών,

όμως για τις περισσότερο σύνθετες περιπτώσεις, όπως η παραγωγική χρήση της

Python με πλήθος εντολών, απαιτούνται ολοκληρωμένα προγράμματα ή σύνθετα

σενάρια. Η Python εκτελεί εντολές οι οποίες μπορεί να πληκτρολογούνται απευθείας

στο περιβάλλον του διαδραστικού διερμηνευτή, τη γραμμή εντολών, ή να δίνονται σε

αρχείο για εκτέλεση. Σε κάθε περίπτωση το αποτέλεσμα είναι το ίδιο.

Κάθε ομάδα εντολών Python η οποία τοποθετείται σειριακά σε ένα αρχείο μπορεί να

χρησιμοποιηθεί ως πρόγραμμα ή σενάριο (script), ως έχει, δηλαδή όπως την εκτελούμε

στο περιβάλλον του διαδραστικού διερμηνευτή. Όμως όταν χρησιμοποιούμε αρχείο

προσθέτουμε και επιπλέον δομή, καθώς αυτό εξυπηρετεί τις ανάγκες σύνθετων ροών

στις περιπτώσεις πολύπλοκων προγραμμάτων.

Στην πολύ βασική του μορφή ένα πρόγραμμα μπορεί να αποτελείται από ένα αρχείο το

οποίο περιλαμβάνει μια απλή συνάρτηση και την κλήση της.

Για παράδειγμα, μπορούμε να δημιουργήσουμε ένα αρχείο κειμένου και να

τοποθετήσουμε σε αυτό την παρακάτω συνάρτηση. Η είναι η μοναδική

συνάρτηση η οποία ορίζεται στο αρχείο και στην συνέχεια καλείται με την εντολή

. Εκτός από την συνάρτηση, υπάρχουν και ορισμένες εντολές

ανάθεσης τιμών σε μεταβλητές, και η κλήση της συνάρτησης. Η κλήση επιστρέφει μια

τιμή, η οποία ανατίθεται στην μεταβλητή graph. Η λειτουργία του συγκεκριμένου

προγράμματος είναι η δημιουργία ενός στικτού γραφήματος.

Αν και σε αυτό το στοιχειώδες πρόγραμμα δεν υπάρχει ουσιαστική διαφορά από ένα

απλό σενάριο που εκτελείται από τη γραμμή εντολών, η δομή αυτή προσφέρει πολλές

Page 9: 1404_book_u5

9

επιλογές και καλύτερο έλεγχο στην ροή εκτέλεσης, που είναι πολύ χρήσιμες όταν

δημιουργούνται μεγαλύτερες εφαρμογές.

Για την εκτέλεση του παραπάνω σεναρίου από το αρχείο και όχι από τη γραμμή

εντολών, αυτό πρέπει να αποθηκευτεί σε ένα αρχείο κειμένου το οποίο να

αναγνωρίζεται από την Python. Δηλαδή, ένα αρχείο κειμένου με κατάληξη .py, για

παράδειγμα my_graph.py. Στην συνέχεια πρέπει να δώσουμε την παρακάτω εντολή

στην γραμμή εντολών του λειτουργικού συστήματος το οποίο χρησιμοποιούμε, αν

αυτό είναι windows. Αν είναι Unix / Linux τότε το εκτελούμε με αντίστοιχο τρόπο από την

γραμμή εντολών ή κατάλληλα scripts.

Πολλές φορές επιθυμούμε να εκτελέσουμε ένα πρόγραμμα σε αρχείο δίνοντας αρχική

τιμή σε ορισμένα ορίσματα, χρήσιμα για αρχικοποίηση μεταβλητών. Αυτό είναι εφικτό

με την χρήση ορισμάτων στη γραμμή εντολών. Εκεί μπορούμε να δώσουμε ορίσματα

για την εκτέλεση ενός αρχείου, τα οποία αποθηκεύονται ως λίστα συμβολοσειρών στην

μεταβλητή sys.argv.

Page 10: 1404_book_u5

10

Για παράδειγμα αν καλέσουμε το πρόγραμμα με τα εξής ορίσματα:

τότε θα λάβουμε το παρακάτω αποτέλεσμα.

Η έξοδος ενός σεναρίου μπορεί να ανακατευθυνθεί σε ένα αρχείο χρησιμοποιώντας τη

γραμμή εντολών. Για παράδειγμα, το παρακάτω πρόγραμμα απλά επιστρέφει τις τιμές

δύο μεταβλητών.

Αν το εκτελέσουμε από την γραμμή εντολών του λειτουργικού θα λάβουμε το εξής.

Page 11: 1404_book_u5

11

Αν όμως θέλουμε να τοποθετήσουμε την έξοδο σε ένα αρχείο, θα εκτελέσουμε με την

παρακάτω γραμμή.

Το αποτέλεσμα θα καταγραφεί στο αρχείο out1 όπως παρακάτω.

Προϋπόθεση για την εκτέλεση των αρχείων από την γραμμή εντολών του λειτουργικού

συστήματος είναι να έχουμε σωστές μεταβλητές περιβάλλοντος. Η παραμετροποίηση

σε κάθε σύστημα είναι διαφορετική, όμως θα πρέπει να έχουμε ελέγξει ότι τα εκτελέσιμα

της Python, αλλά και τα άλλα πακέτα, είναι σωστά ορισμένα.

1.2 Σύνθετα προγράμματα

Για σχετικά απλά σενάρια και προγράμματα, τα οποία περιέχουν μόνο λίγες γραμμές

κώδικα, μια απλή συνάρτηση λειτουργεί αρκετά καλά. Ενδεχομένως, ένα σενάριο να

μην περιέχει κάποια συνάρτηση αλλά μόνο εντολές σε σειριακή μορφή.

Όμως όταν ένα σενάριο είναι μεγαλύτερο και αποτελείται από περισσότερες

συναρτήσεις και ροές ελέγχου, τότε είναι σκόπιμο να εντάξουμε μια συνάρτηση

ελέγχου. Εδώ η συνάρτηση ελέγχου είναι η main. Γενικά είναι προτιμότερο να

διαχωριστεί η συνάρτηση ελέγχου από τον υπόλοιπο κώδικα. Για παράδειγμα στο

επόμενο ορίζουμε δύο συναρτήσεις και μια συνάρτηση ελέγχου την main.

Page 12: 1404_book_u5

12

Η συνάρτηση ελέγχου καλεί την συνάρτηση (με το κατάλληλο όρισμα, αν

υπάρχει τέτοιο) και δημιουργεί ένα γράφημα. Για να εκτελέσουμε το πρόγραμμα θα

δώσουμε την παρακάτω εντολή. Είναι τυπικό να έχουμε την κλήση στο τέλος αλλά

ορισμένες φορές μπορεί να τεθεί και στην αρχή του αρχείου.

Συχνά συνδυάζουμε τα σενάρια με δομοστοιχεία όταν θέλουμε να κάνουμε τις

συναρτήσεις που έχουν δημιουργηθεί σε ένα σενάριο διαθέσιμες και σε άλλα

δομοστοιχεία ή σενάρια. Επίσης, ένα δομοστοιχείο μπορεί να ρυθμιστεί έτσι ώστε να

μπορεί να τρέξει σαν ένα σενάριο είτε να παρέχει μια γρήγορη διασύνδεση σε αυτό για

τους χρήστες ή να παρέχει άγκιστρα για την αυτοματοποιημένη δοκιμή του

δομοστοιχείου.

Page 13: 1404_book_u5

13

1.3 Διανομή εφαρμογών Python

Στην Python, όταν αυτή χρησιμοποιείται για εφαρμογές σχετικά εκτεταμένες, είναι

αναγκαία η διανομή του προγράμματος ή σεναρίου με κάποιο μέσο. Τα σενάρια

μπορούν να διανεμηθούν ως αρχεία πηγαίου κώδικα (αρχεία με κατάληξη .py). Επίσης

μπορούν να διανεμηθούν ως αρχεία ενδιάμεσου κώδικα (αρχεία με κατάληξη .pyc ή

.pyo). Ένα αρχείο ενδιάμεσου κώδικα θα εκτελεστεί σε οποιαδήποτε πλατφόρμα,

εφόσον έχει την κατάλληλη δομή και κώδικα.

ΥΠΟΕΝΟΤΗΤΑ 2. ΕΞΑΙΡΕΣΕΙΣ

Στα πλαίσια της υποενότητας αυτής, θα περιγραφούν συνοπτικά ορισμένα από τα

βασικά στοιχεία των εξαιρέσεων της γλώσσας Python και θα παρουσιαστούν βασικά

παραδείγματα για εξοικείωση των εκπαιδευόμενων με την ορολογία και τη χρήση τους.

2.1 Βασικά στοιχεία

Οι εξαιρέσεις είναι ένα χαρακτηριστικό των γλωσσών προγραμματισμού το οποίο έχει

ως στόχο την διαχείριση ασυνήθιστων ή μη αναμενόμενων περιπτώσεων κατά την

εκτέλεση ενός προγράμματος. Η πιο συνηθισμένη χρήση των εξαιρέσεων είναι για την

διαχείριση σφαλμάτων, τα οποία ανακύπτουν κατά την εκτέλεση ενός προγράμματος,

αλλά είναι επίσης δυνατό να χρησιμοποιηθούν και για αρκετούς διαφορετικούς

λόγους. Η Python παρέχει ένα αρκετά εκτενές ενσωματωμένο σύνολο εξαιρέσεων.

Εκτός από αυτές, οι χρήστες της γλώσσας έχουν επιπλέον τη δυνατότητα να ορίσουν

και νέες εξαιρέσεις για να εξυπηρετήσουν δικές τους ανάγκες.

Η έννοια της εξαίρεσης ως μηχανισμού διαχείρισης σφαλμάτων υπάρχει στις

αντικειμενοστρεφείς γλώσσες προγραμματισμού εδώ και αρκετά χρόνια. Ωστόσο, οι

προγραμματιστές δεν τις χρησιμοποιούν καθολικά, καθώς δεν είναι υποχρεωτική δομή

και συνήθως απαιτεί περισσότερο χρόνο κατά τον προγραμματισμό. Παρά το γεγονός

ότι αποτελεί βέλτιστη πρακτική και βελτιώνει την ποιότητα του κώδικα, δεν είναι σπάνια η

δημιουργία προγραμμάτων χωρίς την χρήση της ακόμη και σε γλώσσες που

υποστηρίζουν το μηχανισμό και είναι διαδεδομένες για αρκετά χρόνια.

Ο μηχανισμός των εξαιρέσεων αποτελεί μια τυπική επιλογή για τη διαχείριση

σφαλμάτων, ωστόσο είναι πρακτικά αδύνατο να διαχειριστεί κάθε περίπτωση

Page 14: 1404_book_u5

14

ενδεχόμενου σφάλματος σε ένα πρόγραμμα. Η εισαγωγή ελέγχων σε κάθε σημείο του

κώδικα για κάθε πιθανό σφάλμα είναι πολλές φορές αδύνατη ή ασύμφορη. Γενικά σε

ένα πρόγραμμα καθορίζουμε τα σημεία στα οποία αναμένεται σφάλμα και με βάση την

κρισιμότητα μιας λειτουργίας χρησιμοποιούμε τον μηχανισμό. Συνήθως τα σημεία

διεπαφής με τον χρήστη ή επικοινωνίας με συστήματα είναι τα πλέον απρόβλεπτα,

οπότε τα χειριζόμαστε κατάλληλα.

Στη συνέχεια παρουσιάζεται μια γενική εισαγωγή στις εξαιρέσεις και στον τρόπο με τον

οποίο χρησιμοποιούνται στην Python.

2.1.1 Σφάλματα και εξαιρέσεις

Τα περισσότερα προγράμματα λειτουργούν σε περιβάλλον το οποίο δεν είναι αυστηρά

ελεγχόμενο από τον προγραμματιστή, όπως κατά την περίοδο ανάπτυξης του

λογισμικού. Ακόμη και αν ένας προγραμματιστής έχει προβλέψει όλα τα στοιχεία

αδυναμίας στον κώδικά του, ώστε να μην υπάρχει περίπτωση να εμφανιστεί κάποιο

σφάλμα, ένα πρόγραμμα πάντοτε ενδέχεται να συναντήσει σφάλματα κατά την

εκτέλεσή του, που μπορεί να οφείλονται σε παράγοντες έξω από αυτό. Τα σφάλματα

ποικίλουν από απλά έως πολύ σοβαρά και μπορεί να προκαλέσουν από απλά

εσφαλμένα αποτελέσματα έως και διακοπή εκτέλεσης του προγράμματος.

Για παράδειγμα, ας υποτεθεί ότι εκτελούμε ένα πρόγραμμα το οποίο πραγματοποιεί

κάποιους υπολογισμούς και κάποια στιγμή απαιτείται να συνδεθεί με μια βάση

δεδομένων, η οποία όμως δεν είναι διαθέσιμη για κάποιο λόγο. Σε αυτή την περίπτωση

το πρόγραμμα δεν θα μπορεί να συνεχίσει την ομαλή λειτουργία του. Στο σημείο αυτό ή

θα πρέπει να πραγματοποιηθεί μια διαχείριση του προβλήματος ή το πρόγραμμα θα

διακόψει την εκτέλεσή του με σφάλμα.

Όταν δημιουργούνται προβλήματα όπως αυτό, η διαχείριση από τον προγραμματιστή

μπορεί να γίνει με διάφορους τρόπους που κυμαίνονται από πλήρη διαχείριση έως

ελάχιστη. Γενικά, οι εναλλακτικές που ακολουθούνται εντάσσονται στις παρακάτω

κατηγορίες ανάλογα με το βαθμό επιτήδευσης με τον οποίο αντιμετωπίζουν το

πρόβλημα.

Η απλούστερη περίπτωση είναι να μην κάνουμε καμία διαχείριση του προβλήματος.

Πολύ συχνά είναι αποδεκτό να μην πραγματοποιείται καμία απολύτως διαχείριση

των πιθανών σφαλμάτων και να αφήνουμε το πρόγραμμα να διακόψει με σφάλμα.

Όταν, για παράδειγμα, εργαζόμαστε σε κάποια αρχική έκδοση και μας ενδιαφέρει

κατά κύριο λόγο η βασική λειτουργία, είμαστε ελαστικότεροι, όπως επίσης και όταν

Page 15: 1404_book_u5

15

ένα πρόγραμμα είναι σχετικά μικρό. Η διαχείριση των σφαλμάτων εξαιρέσεων σε

αυτές τις περιπτώσεις είναι χρονοβόρα και δεν υπάρχει κάποιο άμεσο όφελος. Αν,

για παράδειγμα, εκτελούμε ένα σενάριο στη γραμμή εντολών του διαδραστικού

διερμηνευτή δεν μας ενδιαφέρει η πλήρης διαχείριση λαθών, καθώς συνήθως

εκτελούμε μερικές γραμμές κώδικα και το περιβάλλον είναι περισσότερο πρόσφορο

για γρήγορη ανάπτυξη και έλεγχο.

Ένα επόμενο επίπεδο διαχείρισης είναι η ενσωμάτωση κώδικα για την διαχείριση

σφαλμάτων σε ορισμένες συναρτήσεις ή τμήματα κώδικα. Αυτό το βήμα ουσιαστικά

περιλαμβάνει τη δημιουργία ελέγχων σε τιμές, ροές εκτέλεσης και επιστροφές σε

διάφορα σημεία του κώδικα, ειδικά εκεί που περιμένουμε κάποια πιθανή

δυσλειτουργία. Αυτή ή προσέγγιση είναι μια αποσπασματική λύση που μπορεί να

οδηγήσει σε περισσότερο ή λιγότερο κατανοητό και διαχειρίσιμο κώδικα. Επίσης, αν

ελέγχονται ορισμένα σημεία και όχι άλλα, υπάρχει το ενδεχόμενο να λείπουν

σημαντικοί έλεγχοι.

Ο επόμενος, περισσότερο σύγχρονος και ολοκληρωμένος τρόπος διαχείρισης είναι

η χρήση του μηχανισμού των εξαιρέσεων. Οι εξαιρέσεις επιτρέπουν την συγγραφή

κώδικα που είναι ευκρινέστερος και διαχειρίζεται τα σφάλματα καλύτερα. Πρόκειται

στην ουσία για ένα μηχανισμό της ίδιας της γλώσσας ο οποίος παρέχει τη

δυνατότητα να αξιοποιήσουμε τις ενσωματωμένες συναρτήσεις και να

διαχειριστούμε το πρόβλημα με καλύτερο τρόπο, γράφοντας παράλληλα κώδικα με

καλύτερη οργάνωση.

Ο έλεγχος σφαλμάτων με τη χρήση του μηχανισμού των εξαιρέσεων είναι ο πλέον

προτιμητέος τρόπος από τους παραπάνω, καθώς αξιοποιεί ενδογενή στοιχεία της

γλώσσας. Ωστόσο, πρέπει να γίνεται αξιολόγηση του κώδικα και να χρησιμοποιούνται

οι εξαιρέσεις στο βαθμό που απαιτείται και όχι σε σημεία που ενδεχομένως δεν είναι

αναγκαίο.

Με βάση τον μηχανισμό των εξαιρέσεων, όταν προκύψει ένα σφάλμα κατά την

εκτέλεση του κώδικα, δημιουργείται μια εξαίρεση. Η δημιουργία των εξαιρέσεων καλείται

ύψωση ή γέννηση (raising ή throwing). Από εκεί και έπειτα ο κώδικας αναλαμβάνει να

διαχειριστεί την εξαίρεση. Η αντίδραση σε μια εξαίρεση καλείται σύλληψη (catching) και

ο κώδικας ο οποίος χειρίζεται μια εξαίρεση καλείται κώδικας διαχείρισης εξαίρεσης

(exception handling code), ή αλλιώς exception handler.

Page 16: 1404_book_u5

16

Για διαφορετικούς τύπους εξαιρέσεων ή για διαφορετικές εξαιρέσεις μπορεί να

υπάρχουν στον κώδικα διαφορετικοί exception handlers ή ακόμη και διαφορετικοί για

τον ίδιο τύπο εξαίρεσης σε διαφορετικά σημεία του κώδικα.

Διαφορετικά προβλήματα, ωστόσο, απαιτούν διαφορετικές λύσεις. Ανάλογα, δηλαδή,

με το πρόβλημα το οποίο προκαλεί μια εξαίρεση, ένα πρόγραμμα μπορεί να απαιτείται

να εκτελέσει διαφορετικές διορθωτικές ενέργειες. Για παράδειγμα, αν το πρόβλημα είναι

η διακοπή σύνδεσης με τη βάση δεδομένων, τότε αυτό πρέπει να διαχειριστεί

διαφορετικά από την περίπτωση που το πρόβλημα προέκυψε από λάθος δεδομένα και

εντελώς διαφορετικά από την περίπτωση που το πρόβλημα οφείλεται σε άλλη αιτία.

Ένας τρόπος διαχείρισης των εξαιρέσεων είναι η δημιουργία ενός καθολικού

μηνύματος σφάλματος, το οποίο να υποδεικνύει την αιτία του σφάλματος, και η

διερεύνηση του σφάλματος από όλους τους exception handlers για την κατάλληλη

ενέργεια.

Στην πράξη όμως ένας διαφορετικός μηχανισμός έχει αποδειχτεί περισσότερο ευέλικτος.

Αντί για ορισμό ενός μόνο τύπου εξαίρεσης, η Python ορίζει διαφορετικούς τύπους

εξαιρέσεων που αντιστοιχούν στα διαφορετικά προβλήματα που ενδέχεται να

προκύψουν. Ανάλογα με το υποκείμενο συμβάν, μπορούν να υψωθούν διαφορετικοί

τύποι εξαιρέσεων. Επιπλέον, ο κώδικας που συλλαμβάνει τις εξαιρέσεις μπορεί να

οριστεί ώστε να συλλαμβάνει μόνο ορισμένους τύπους.

2.2 Οι εξαιρέσεις στην Python

Η Python παρέχει ένα μηχανισμό εξαιρέσεων που είναι ευέλικτος και επεκτάσιμος.

Βασίζεται στο αντικειμενοστρεφές μοντέλο, αν και δεν είναι αναγκαία η γνώση τεχνικών

αντικειμενοστρεφούς προγραμματισμού για την χρήση του. Έτσι, μια εξαίρεση στην

Python είναι ένα αντικείμενο. Το αντικείμενο δημιουργείται με την εντολή raise όταν

παράγεται σφάλμα. Αυτή προκαλεί την συνέχιση εκτέλεσης του προγράμματος με

διαφορετική όμως ροή από ό,τι αν δεν προέκυπτε το σφάλμα. Αντί, δηλαδή, για την

εκτέλεση της επόμενης εντολής από την raise, γίνεται διερεύνηση για ένα τμήμα κώδικα

(exception handler), το οποίο να είναι σε θέση να διαχειριστεί την εξαίρεση που

δημιουργήθηκε. Εάν βρεθεί ένα τέτοιο τμήμα, τότε εκτελείται αυτό και μπορεί να

προσπελάσει το αντικείμενο της εξαίρεσης για περισσότερες πληροφορίες. Εάν δεν

βρεθεί κάποιο κατάλληλο exception handler, το πρόγραμμα διακόπτεται με μήνυμα

σφάλματος.

Page 17: 1404_book_u5

17

Υπάρχει δηλαδή μια ροή που ξεκινά όταν υψωθεί η raise και αναζητά κατάλληλο

exception handler για να διαχειριστεί την εξαίρεση. Αν βρεθεί, τότε το σφάλμα

διαχειρίζεται, αν όχι, το πρόγραμμα διακόπτεται. Πολύ συνοπτικά, αν μια συνάρτηση Α

καλεί μια συνάρτηση Β και αυτή με τη σειρά της καλεί μια συνάρτηση Γ, και προκύψει

σφάλμα κατά την εκτέλεση της Γ, τότε θα υψωθεί μια εξαίρεση στην Γ. Αν δεν έχουμε

κώδικα για την διαχείριση της εξαίρεσης στην Γ, τότε η εξαίρεση περνά στην συνάρτηση

Β και έπειτα στην Α. Αν δεν υπάρχει σε κανένα σημείο κώδικας για την διαχείρισή της, θα

παραχθεί μήνυμα λάθους και το πρόγραμμα θα διακοπεί.

Για παράδειγμα, μια λάθος εντολή που εκτελείται στην γραμμή εντολών μπορεί να

προκαλέσει ένα σφάλμα κατά την εκτέλεσή της. Η Python τότε υψώνει μια εξαίρεση. Αν

αυτή δεν διαχειριστεί από κάποιο τμήμα κώδικα (exception handler), τότε απλά

εκτυπώνεται ένα μήνυμα το οποίο αναφέρεται στο σφάλμα το οποίο προέκυψε. Για

παράδειγμα:

Όταν χρησιμοποιούμε τον μηχανισμό των εξαιρέσεων, είναι δυνατό να δημιουργηθούν

διαφορετικοί τύποι εξαιρέσεων που να αντανακλούν την πραγματική αιτία του

σφάλματος ή την περίπτωση σφάλματος που αναφέρεται. Η Python παρέχει αρκετούς

διαφορετικούς τύπους εξαιρέσεων, που καλύπτουν πολλές περιπτώσεις σφαλμάτων.

BaseException

SystemExit

KeyboardInterrupt

GeneratorExit

Exception

StopIteration

ArithmeticError

FloatingPointError

OverflowError

Page 18: 1404_book_u5

18

ZeroDivisionError

AssertionError

AttributeError

BufferError

EnvironmentError

IOError

OSError

WindowsError (Windows)

VMSError (VMS)

EOFError

ImportError

LookupError

IndexError

KeyError

MemoryError

NameError

UnboundLocalError

ReferenceError

RuntimeError

NotImplementedError

SyntaxError

IndentationError

TabError

SystemError

TypeError

ValueError

UnicodeError

UnicodeDecodeError

UnicodeEncodeError

UnicodeTranslateError

Warning

DeprecationWarning

PendingDeprecationWarning

RuntimeWarning

Page 19: 1404_book_u5

19

SyntaxWarning

UserWarning

FutureWarning

ImportWarning

UnicodeWarning

BytesWarningException

Το σύνολο των εξαιρέσεων της Python είναι δομημένο ιεραρχικά. Κάθε τύπος εξαίρεσης

στην Python είναι μια κλάση, η οποία κληρονομεί από την γονική της κλάση εξαίρεσης.

Οι περισσότερες εξαιρέσεις κληρονομούν από την κλάση Exception. Πληροφορίες και

λεπτομέρειες για τους τύπους των εξαιρέσεων βρίσκεται στην τεκμηρίωση της

γλώσσας. Με την χρήση του δομοστοιχείου είναι δυνατή η ανάκτηση μιας

αλφαβητικής λίστας.

2.2.1 Ύψωση εξαιρέσεων

Οι εξαιρέσεις υψώνονται από αρκετές ενσωματωμένες συναρτήσεις της Python, όταν

προκύψει κάποιο σφάλμα κατά την εκτέλεση ενός προγράμματος.

Για παράδειγμα, αν δώσουμε την παρακάτω εντολή στον διαδραστικό διερμηνευτή,

κατά την εκτέλεση της εντολής ο ενσωματωμένος κώδικας ελέγχου σφαλμάτων της

Python ανιχνεύει ότι στην πρώτη περίπτωση υπάρχει λάθος σύνταξης και υψώνει μια

εξαίρεση SyntaxError, ενώ στη δεύτερη περίπτωση ανιχνεύει ότι υπάρχει λάθος εσοχή και

υψώνει μια εξαίρεση IndentationError. Τα ίδια σφάλματα μπορούν να προκύψουν και

από την εκτέλεση ενός προγράμματος με αρχείο.

Αυτές οι εξαιρέσεις μεταδίδονται προς τα πίσω έως το υψηλότερο επίπεδο (εδώ τον

διαδραστικό διερμηνευτή της Python), ο οποίος τα διαχειρίζεται εκτυπώνοντας ένα

μήνυμα το οποίο δηλώνει ότι έχει προκύψει η εξαίρεση, καθώς δεν έχει οριστεί κώδικας

για την διαχείρισή της.

Page 20: 1404_book_u5

20

Εκτός από τις ενσωματωμένες συναρτήσεις, εξαιρέσεις μπορούν να υψωθούν επίσης

και από τον κώδικα ενός δικού σας προγράμματος με την χρήση της εντολής raise. Η

βασική μορφή της εντολής είναι η παρακάτω:

Το τμήμα raise exception(args) του κώδικα δημιουργεί μια εξαίρεση. Τα ορίσματα που

μπορούμε να ορίσουμε στην εξαίρεση είναι τιμές που γενικά βοηθάνε τον

προγραμματιστή στην εύρεση του τι ακριβώς συνέβη. Έπειτα από την ύψωση της

εξαίρεσης, η raise την αναλαμβάνει και αναζητά κάποιον exception catcher για αυτόν

τον τύπο εξαίρεσης. Εάν δεν βρεθεί τέτοιος, αυτό θα προκαλέσει είτε την διακοπή του

προγράμματος με σφάλμα ή θα προκαλέσει ένα μήνυμα σφάλματος στην κονσόλα

(αν βρισκόμαστε σε διαδραστικό περιβάλλον).

Για παράδειγμα, μπορούμε να υψώσουμε μια εξαίρεση σε σφάλμα σύνταξης δίνοντας

μια συμβολοσειρά ως όρισμα. Η χρήση συμβολοσειράς όταν δημιουργούνται

εξαιρέσεις είναι συνηθισμένη και οι περισσότερες ενσωματωμένες εξαιρέσεις της

Python, αν τους δοθεί ένα όρισμα, θεωρούν ότι είναι ένα μήνυμα το οποίο πρέπει να

εκτυπωθεί ως μια εξήγηση του τι συνέβη, όπως εδώ:

Ωστόσο, αυτό δεν ισχύει πάντοτε, καθώς κάθε εξαίρεση αποτελεί ξεχωριστή κλάση και

τα ορίσματα που αναμένονται όταν δημιουργείται μια νέα εξαίρεση αυτής της κλάσης

καθορίζονται αποκλειστικά από τον ορισμό της κλάσης. Επίσης, οι εξαιρέσεις που

ορίζονται από τον χρήστη συχνά χρησιμοποιούνται για διαφορετικούς λόγους από τη

διαχείριση εξαιρέσεων και συνεπώς ενδέχεται να μην δέχονται μήνυμα κειμένου.

2.2.2 Σύλληψη και διαχείριση εξαιρέσεων

Αυτό που πετυχαίνουμε με τη χρήση εξαιρέσεων είναι ότι αποφεύγουμε την διακοπή

εκτέλεσης ενός προγράμματος, αν για κάποιο λόγο προκύψει ένα ανεπιθύμητο

σφάλμα. Με τον ορισμό κατάλληλων exception handlers μπορεί να διασφαλιστεί ότι

εξαιρέσεις που προκύπτουν σε συνηθισμένες περιπτώσεις δεν θα προκαλούν την

Page 21: 1404_book_u5

21

διακοπή του προγράμματος. Στις περιπτώσεις αυτές, ενδέχεται να εμφανιστεί ένα

μήνυμα σφάλματος στον χρήστη ή να γίνει κάτι άλλο, όπως να διορθωθεί το

πρόβλημα, όμως το πρόγραμμα δεν διακόπτεται.

Το βασικό σημείο επομένως είναι να συλλάβουμε την εξαίρεση με κάποιο τμήμα κώδικά

μας και να την διαχειριστούμε. Αν δεν το κάνουμε, η εξαίρεση δεν θα διαχειριστεί και το

πρόγραμμα θα διακοπεί.

Η βασική σύνταξη της Python για την σύλληψη και διαχείριση εξαιρέσεων είναι η

ακόλουθη και πραγματοποιείται με την χρήστη των λέξεων κλειδιών try και except και

ορισμένες φορές της else. Τα τμήματα κώδικα που είναι κρίσιμα για την ομαλή εκτέλεση

ενός προγράμματος και ενδέχεται να προκαλέσουν κάποια εξαίρεση τοποθετούνται σε

μια δομή ελέγχου try και ο κώδικας που διαχειρίζεται την εξαίρεση τοποθετείται στην

δομή except. Εναπόκειται στον προγραμματιστή να ορίσει τον κατάλληλο κώδικα που

θα διαχειριστεί την εξαίρεση αν υψωθεί κάποια στιγμή:

Η εντολή try εκτελείται αφού προηγουμένως εκτελεστεί ο κώδικας στο τμήμα body της

εντολής, τον οποίο θέλουμε να ελέγξουμε.

Εάν η εκτέλεση του body είναι επιτυχής (δηλαδή δεν προκύψει κάποια εξαίρεση από

την try), τότε εκτελείται η else και η try ολοκληρώνεται και δεν συμβαίνει κάτι άλλο

στην συνέχεια.

Εάν όμως υψωθεί κάποια εξαίρεση στην try, τότε διερευνούνται με την σειρά οι

προτάσεις της except για την εύρεση εκείνης, της οποίας η συνδεδεμένη εξαίρεση

ταιριάζει με αυτή που υψώθηκε.

Στην except, τώρα, μπορεί είτε να υπάρχει κάποια πρόταση που να ταιριάζει στην

εξαίρεση που υψώθηκε ή όχι.

Page 22: 1404_book_u5

22

Αν βρεθεί στην except κάποια πρόταση που να ταιριάζει, τότε η εξαίρεση που

υψώθηκε θα ανατεθεί στην μεταβλητή που έχει το όνομα του συνδεδεμένου τύπου

και θα εκτελεστεί ο κώδικας της εξαίρεσης που είναι συνδεδεμένη.

Εάν δεν βρεθεί στην except κάποια πρόταση που να ταιριάζει, τότε η εξαίρεση που

υψώθηκε δεν θα μπορεί να διαχειριστεί από αυτό το try και η εξαίρεση θα μεταδοθεί

στην συνάρτηση που κάλεσε την συγκεκριμένη με την ελπίδα ότι κάποιο άλλο try θα

είναι σε θέση να την διαχειριστεί.

Η πρόταση else είναι προαιρετική και χρησιμοποιείται σπάνια. Εκτελείται μόνο εάν το

σώμα της try εκτελείται χωρίς να υψώνονται σφάλματα. Η πρόταση finally μιας try είναι

επίσης προαιρετική και εκτελείται έπειτα από την εκτέλεση των try, except και else.

Εάν μια εξαίρεση έχει υψωθεί από την try και δεν έχει διαχειριστεί από κανένα τμήμα

except, τότε ξαναυψώνεται έπειτα από την εκτέλεση του τμήματος finally. Επειδή το

τμήμα finally εκτελείται πάντοτε, παρέχει ένα καλό σημείο για να συμπεριληφθεί κώδικας

που θα καθαρίζει έπειτα από κάθε διαχείριση εξαίρεσης.

Για παράδειγμα το παρακάτω τμήμα κώδικα στην try, στην δεύτερη περίπτωση θα

προκαλέσει συντακτικά σφάλμα και θα διαχειριστεί από την except.

Σύνοψη Με την ολοκλήρωση της ενότητας αυτής γνωρίζετε:

• τα βασικά στοιχεία των προγραμμάτων και της χρήσης αρχείων στην Python και

πώς να γράφετε και να εκτελείτε απλά σενάρια και προγράμματα,

• τα βασικά στοιχεία των εξαιρέσεων στην Python και πώς να γράφετε και να εκτελείτε

απλά σενάρια και προγράμματα.

Page 23: 1404_book_u5

23

ΒΙΒΛΙΟΓΡΑΦΙΑ

ΔΕ5

• Hetland, Μ., (2005), Beginning Python: From Novice to Professional, Apress, United

States of America.

• Lutz, Μ., (2013), Learning Python, Fifth Edition, O’Reilly Media, Inc., Sebastopol,

United States of America.

• Lutz, Μ., (2011), Programming Python, Fourth Edition, O’Reilly Media, Sebastopol,

United States of America.

• Shaw, Z., (2014), Learn Python the hard way : a very simple introduction to the

terrifyingly beautiful world of computers and code, Third edition, .Addison Wesley,

United States of America.

• Αβούρης, Ν.,Κουκιάς, Μ., Παλιούρας, Β., Σγάρμπας Κ., (2013), Εισαγωγή στους

υπολογιστές με τη γλώσσα Python, Εκδόσεις Πανεπιστημίου Πατρών.