Siirry sisältöön

Python 3/Ohjelman lopettaminen

Wikikirjastosta


Ohjelman suoritus päättyy, kun suorituksessa päästään pääohjelman loppuun. Myös käsittelemättömät virheet lopettavat ohjelman. Ohjelman voi lopettaa kesken suoritusta sys.exit-funktiolla tai heittämällä SystemExit-virheen. Molemmat ottavat ensimmäiseksi parametriksi virhekoodin, joka palautetaan ohjelman käynnistäneelle päätteelle. Käytännön mukaan ohjelma, joka suoritettiin loppuun normaalisti palauttaa 0 ja jonkin virheen takia keskeytetty ohjelma palauttaa kokoinaisluvun väliltä 1–127. Yleensä luku on 1, mutta sitä voi tarvittessa käyttää välittämään virheen laatu ohjelman suorittaneelle päätteelle. Kun sys.exit-funktiolle antaa parametriksi virhetekstin, palauttaa tulostetaan teksti ja sen jälkeen palautetaan virhekoodi 1.

import sys

if len(sys.argv) != 1: # Ensimmäinen argumentti on aina skriptitiedoston nimi.
    sys.exit("Virheellinen määrä argumentteja") # Palauttaa koodin 1

if len(sys.argv) == 2 and sys.argv[1] == "-h":
    print(f"Käyttö: {sys.argv[0]} <tiedosto>")
    sys.exit(0) # Palauttaa koodin 0

# Ohjelman varsinainen koodi, jossa käytetään parametria argv[1].

SystemExit-poikkeus ottaa myös parametriksi virhekoodin tai virhetekstin, mutta se heitetään kuten poikkeukset.

raise SystemExt(0)
raise SystemExt("Dääng!")

On tärkeää, että ohjelma palautta 0 normaain suorituksen lopuksi ja arvon 1–127 epäonnistuneen suorituksen lopuksi, jotta ohjelmaa voi käyttää komentorivillä osana lauseketta.

On olemassa myös funktiot exit ja quit. Nämä on kuitenkin tarkoitettu apufunktioksi interaktiivisesta tulkista poistumiseen. Niitä ei pidä käyttää ohjelman lopettamiseen.

Moduulissa atexit on funktio register, jolla voi rekisteröidä ohjelman lopetuksessa suoritettavan käsittelijäfunktion. Käsittelijäfunktiossa voi esimerkiksi tallentaa keskeneräisen tiedon muistista tai sulkea tietoliikenneyhteydet. Käsittelijäfunktoita voi rekisteröidä useta.

import atexit

def tallenna_logi():
    log.tallenna()

atexit.register(tallenna_logi)

Funkiota voi käyttää myös dekoraattorisyntaksilla.

@atexit.register
def tallenna_logi():
    log.tallenna()

Funktiolla unregister voi poistaa aiemmin rekisteröidyn käsitteljäfunktion.

atexit.unregister(tallenna_logi)