Com os dois tipos de laços descritos na seção anterior, todas as necessidades `normais' de controle de um programa podem ser implementadas. No entanto, quando algo inesperado ocorre, ou uma condição de erro conhecido é atingida, Python oferece uma forma adicional de controlar o fluxo de execução: a exceção.
A exceção é um recurso de linguagens de programação modernas que serve para informar que uma condição incomum ocorreu. Embora existam outras aplicações, em geral comunicam-se através de exceções erros ou problemas que ocorrem durante a execução de um programa.
Exceções são internamente geradas pelo interpretador Python quando situações excepcionais ocorrem. No exemplo abaixo,
>>> a = [1, 2, 3]
>>> print a[5]
o código interno do interpretador sabe que não podemos acessar uma lista através um índice não-existente, e gera uma exceção:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
IndexError: list index out of range
Vamos analisar a mensagem exibida. A primeira linha anuncia um traceback, que é a forma como é exibida a pilha de execução que gerou a exceção. A segunda indica a linha de código na qual ocorreu o problema, e o arquivo. Como estamos usando o modo interativo neste exemplo, o arquivo aparece como <stdin>, que é a entrada padrão. A terceira linha indica o tipo de exceção levantada -- neste caso, IndexError -- e informa uma mensagem que descreve mais especificamente o problema.
>>> a = [1, 2, 3]
>>> try:
... print a[5]
... except IndexError:
... print "O vetor nao possui tantas posições!"
O vetor nao possui tantas posições!
A instrução try captura exceções que ocorrerem no seu bloco de código; a linha except determina quais tipos de exceção serão capturados. A sintaxe da cláusula except segue os formatos:
except tipo_da_excecao [, variavel_da_excecao]:
# bloco de código
ou
except (tipo_excecao_1, tipo_excecao_2, ...)
[, variavel_da_excecao]:
# bloco de código
O primeiro elemento da cláusula except é um tipo da exceção, ou uma tupla de tipos caso múltiplas exceções devam ser tratadas da mesma forma. O segundo elemento é opcional; permite que seja capturada uma instância que armazena informações da exceção. Um uso trivial desta instância é imprimir a mensagem de erro:
>>> a = "foo"
>>> print a + 1
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: cannot add type "int" to string
Podemos capturar e tratar de forma especial o erro acima, imprimindo a mensagem fornecida e continuando a execução normalmente.
>>> try:
... print a + 1
... except TypeError, e:
... print "Um erro ocorreu: %s" % e
...
Um erro ocorreu: cannot add type "int" to string
>>>
Diversos tipos de exceções vêm pré-definidas pelo interpretador Python; o guia de referência contém uma lista completa e os casos onde são levantadas. Note também que esta introdução a exceções não cobre a sua sintaxe completa; consulte a seção Errors and Exceptions do tutorial Python para maiores detalhes.