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:

Virheenkäsittelyketju

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()