É altamente improvável que você ainda não se se deparou exceções executando algum comando do Python. Por exemplo, é possível te ocorrido uma exceção se você digitou um comando com um erro de digitação.

Exceções são geradas por diferentes tipos de erros que surgem quando da execução do código Python. Em seu próprio código, é possível pegar erros, ou definir os tipos de erros personalizadas. Veja  the built-in Exceptions para entender os tipos de exceções.

Exceções

Exceções são geradas por erros no Python:

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

1/0 #divisão por zero

1 + 'e' #soma de tipos não suportado

d = {1:1, 2:2}
d[3] #erro de chave

l = [1, 2, 3]
l[4] #erro de posição
l.foobar #erro de atributo

[/pastacode]

Como foi visto, existem diferentes tipos de exceções para diferentes tipos de erros.

Pegando as Exceções

try/except

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

while True:
    try:
        x = int(raw_input('Please enter a number: '))
        break
    except ValueError:
        print('That was no valid number.  Try again...')

[/pastacode]

try/finally

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

try:
    x = int(raw_input('Please enter a number: '))
finally:
    print('Thank you for your input')

[/pastacode]

Importante para a gestão de recursos (por exemplo, fechar um arquivo).

Mais fácil pedir perdão do que permissão

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

def imprima_ordenado(colecao):
    try:
        colecao.sort()
    except AttributeError:
        print 'Imutável'
        pass
    print(colecao)

imprima_ordenado([1, 3, 2])
imprima_ordenado(set((1, 3, 2)))
imprima_ordenado('132')

[/pastacode]

Gerando Exceções

Capturando e regerando exceções:

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

def filtro_nome(nome):
    try:
        nome = nome.encode('ascii')
    except UnicodeError, e:
        if nome == 'João':
            print('OK, João')
        else:
            raise e
    return nome

filtro_nome('João')
filtro_nome('André')

[/pastacode]

Exceções para passar mensagens entre partes do código:

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

def seta_aquiles(x):
    if abs(x - 1) < 1e-3:
        raise StopIteration
    x = 1 - (1-x)/2.
    return x

x = 0

while True:
    try:
        x = seta_aquiles(x)
        print x
    except StopIteration:
        break

[/pastacode]

Use exceções para notificar que determinadas condições são conhecidas (por exemplo StopIteration) ou não (por exemplo, geração de erro personalizada).