Je mag zelf in je code ook exceptions genereren. Daarvoor is het gereserveerde woord raise bestemd. Je laat het volgen door één van de bekende exceptions (je mag eventueel ook je eigen exceptions definiëren, maar daarvoor moet je de hoofdstukken 21 tot en met 23 bestuderen). Je mag een exception die je genereert willekeurige argumenten meegeven, en die zijn dan weer via het args attribuut te benaderen.

Je vraagt je misschien af waarom je exceptions zou willen genereren. Het antwoord is dat als je een module programmeert, en er een fout kan optreden in een van de functies in de module (bijvoorbeeld omdat het hoofdprogramma de verkeerde parameters meegeeft), het eigenlijk niet de bedoeling is dat je foutmeldingen print. Het is veel netter om een exception te genereren, en het hoofdprogramma deze exception af te laten handelen. Hier is een voorbeeld:

def getStringLenMax10( prompt ):
    s = input( prompt )
    if len( s ) > 10:
        raise ValueError( "Lengte groter dan 10", len( s ) )
    return s

print( getStringLenMax10( "Gebruik 10 tekens of minder: " ) )

Als je deze code uitvoert, zie je dat als je een string invoert die meer dan 10 tekens bevat, een ValueError exception wordt gegenereerd. De exception krijgt twee argumenten, die je als een tuple getoond ziet worden als Python de exception op het scherm gooit. Je kunt deze exception in de code afhandelen op dezelfde manier als je exceptions afhandelt die door Python worden geproduceerd.

Het gereserveerde woord raise heeft een tweede functie: als je in de afhandeling van een except zit, dan kun je, in plaats van de exception meteen af te handelen, de exception doorgeven naar het “hoger gelegen niveau” van het programma. Je doet dat door het command raise te geven, zonder parameters, en de exception wordt dan als “nog niet afgehandeld” beschouwd. Dit kan nuttig zijn als je een beetje extra afhandeling wilt doen voordat het programma “crasht” op grond van de exception, of de exception elders wordt opgevangen. Bijvoorbeeld:

fp = open( "pc_rose.txt ")
try:
    buf = fp.read()
    print( buf )
except IOError:
    fp.close()
    raise
fp.close()

Deze code loopt waarschijnlijk goed, maar als er een IOError optreedt tijdens het lezen van het bestand, dan wordt het bestand netjes gesloten alvorens de exception wordt doorgegeven.