Virheenkäsittely - TiViOpetus/Autolainaus GitHub Wiki
Virhetilanteiden genenrointi ja käsittely
Sovelluksen PostgreSQL-tietokannan hallintajärjestelmä generoi virheilmoitukset vääristä tietotyypeistä, puuttuvista pakollisista tiedoista tai viite-eheys sääntöjen rikkomuksista. Ne pitää saada pääohjelman administrative.py
käyttöön. Tämä edellyttää virhetilanteiden generointia kaikissa kirjastoissa ja moduuleissa joita pääohjelma käyttää. Seuraavassa kaaviossa on kuvattu koko ketju:
dbOperations.py
-moduulissa on määriteltävä virhetilanne (raise error), jotta virhetieto välittyy pääohjelmalle administrative.py
. Siellä ei enää saa käyttää raise
-komentoa, koska se johtaisi ajonaikaiseen virheeseen. Pääohjelma reagoi virheeseen luomalla msgBox
-olion.
Sama tilanne pätee myös kaikkiin muihin moduuleihin, joita sovellus käyttää. Jos niissä on generoitu virheilmoituksia, ne pitää muistaa välittää raise
-komennolla pääohjelmalle käsiteltäväksi.
Koodikatkelmassa on dbOperations.py
-moduulin koodi, joka välittää virheen pääohjelmalle. Se perii yleisen sisään rakennetun Exception
-luokan sekä psycopg2
-kirjastossa määritellyn Error
-luokan ominaisuudet
# Jos tapahtuu virhe, välitetään se luokkaa käyttävälle ohjelmalle
except (Exception, psycopg2.Error) as e:
raise e
Pääohjelmassa tietokantamoduulin lähettämään virheilmoitukseen reagoidaan seuraavasti:
# Kutsutaan tallennusmetodia
try:
dbConnection.addToTable(tableName, lenderDictionary)
# Virheen tapahtuessa avataan msgBox openWarning-metodin avulla
except Exception as e:
self.openWarning('Tallennus ei onnistunut', str(e))
Kun virheilmoitus näytetään käyttäjälle, se pitää muuttaa merkkijonoksi, koska virheilmoituksessa saattaa olla myös numeroita ja totuusarvoja.
Virheilmoitusdialogin koodi voidaan toteuttaa seuraavasti:
# Malli mahdollista virheilmoitusta varten
def openWarning(self, title: str, text:str) -> None:
"""Opens a message box for errors
Args:
title (str): The title of the message box
text (str): Error message
"""
msgBox = QtWidgets.QMessageBox()
msgBox.setIcon(QtWidgets.QMessageBox.Critical)
msgBox.setWindowTitle(title)
msgBox.setText('Tapahtui vakava virhe')
msgBox.setDetailedText(text)
msgBox.setStandardButtons(QtWidgets.QMessageBox.Ok)
msgBox.exec()