En Python, le bloc else associé à un try s'exécute uniquement si aucune exception n'a été levée dans le bloc try.

Règles précises :

Si le bloc try s'exécute sans lever d'exception :

Le bloc else est exécuté immédiatement après le try.
Le bloc finally (s'il existe) est exécuté après le else.

Si une exception est levée dans le bloc try :

Le bloc else est ignoré.
Le contrôle passe au bloc except correspondant (s'il existe).
Le bloc finally (s'il existe) est exécuté après le except.

Si une exception est levée dans le bloc else :

Elle n'est pas capturée par les blocs except du même try (car le else est considéré comme "hors du try" pour la gestion des exceptions).

Exemple illustratif :
try:
print("Exécution du bloc try")
Aucune exception levée ici
except ValueError:
print("Exception ValueError capturée")
else:
print("Bloc else exécuté (pas d'exception)")
finally:
print("Bloc finally toujours exécuté")

Sortie attendue :
Exécution du bloc try
Bloc else exécuté (pas d'exception)
Bloc finally toujours exécuté

Cas où le else n'est pas exécuté :
try:
print("Exécution du bloc try")
raise ValueError("Erreur simulée")
except ValueError:
print("Exception ValueError capturée")
else:
print("Ce bloc ne sera pas exécuté")
finally:
print("Bloc finally toujours exécuté")

Sortie attendue :
Exécution du bloc try
Exception ValueError capturée
Bloc finally toujours exécuté

Points clés :
Le else est lié au succès du try, pas à l'absence d'erreur dans les blocs except.
Il est souvent utilisé pour des actions qui doivent s'exécuter uniquement si le try a réussi (ex. : validation post-opération).
Le finally s'exécute toujours, qu'il y ait eu une exception ou non.