Subsecções

2.5.4 Exceções

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.

2.5.4.1 Tratando exceções

A exceção normalmente imprime um traceback e interrompe a execução do programa. Uma ação comum é testar e controlar a exceção; para este fim, usamos uma cláusula try/except:

    >>> 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.