Exceptions natives
==================

Les exceptions sont toujours des instances de classes, et les classes d'exceptions héritent
toujours  de la class ``BaseException``.

Le nom de l'exception est en réalité le nom de la classe, ici l'exception levée par la ligne
``return 1 / 0`` est une instance de la classe ``ZeroDivisionError``.

Cette exception fait partie des nombreuses exceptions préféfinies en Python. Ensemble, elles
forment une *hiérarchie* dont voici un extrait:

.. code-block:: text


  BaseException
   +-- SystemExit
   +-- KeyboardInterrupt
   +-- Exception
        +-- ArithmeticError
        |    +-- ZeroDivisionError
        +-- LookupError
        |    +-- IndexError
        |    +-- KeyError
        +-- OSError
        |    +-- FileNotFoundError
        +-- TypeError
        +-- ValueError


IndexError et KeyError
----------------------

``IndexError`` est levée quand on essaye d'accéder à un index trop grand
dans une liste::

    ma_liste = ["pomme"]
    ma_liste[2] = "abricot"

    # IndexError: list assignment index out of range

``KeyError`` est levée quand on essaye d'accéder à une clé qui n'existe pas
dans un dictionnaire::

    scores = { "Alice" : 10 }
    score_de_bob = scores["Bob"]

    # KeyError: 'Bob'

Notez que la description de ``KeyError`` est la valeur de la clé manquante.

ValueError
----------

``ValueError`` est levée (entre autres) quand on tente une maunvaise conversions::

   entrée_utilisateur = "pas un nombre"
   valeur = int(entrée_utilisateur)


KeyboardInterrupt
-----------------

``KeyboardInterrupt`` est levée quand on fait ``ctrl-c``.


FileNotFoundError
------------------

``FileNotFoundError`` est levée quand on essaye d'ouvrir
en lecture un fichier qui n'exsiste pas::


    with open("fichier-inexistant.txt", "r") as f:
        contenu = f.read()
