Captura genérica para python

86

Tenho um comportamento extremamente estranho que parece resultar em exceções silenciosas. Como posso escrever um try catch geral, onde posso depurar todas as exceções. Algo na linha de:

try:
    # something that fails
except e:
    print e

Um pouco mais sobre o problema em questão em detalhes:

Eu tenho um aplicativo Django que em meu computador (Ubuntu Linux 8.10) funciona bem tanto por meio do runserver quanto do mod-python. No servidor de implantação (Ubuntu Linux 8.10), ele funciona bem por meio do runserver, mas falha por meio do apache em mod-python.

Reduzi a causa a uma parte do aplicativo que usa Berkeley DB (bsddb.db) e chaves secundárias. O método de retorno de chamada para chaves secundárias usa pickle para formatar as chaves. Ele falha quando eu chamo pickle em um único valor. No entanto, ele só falha quando eu uso cPickle, e usar pickle nos mesmos valores fora da função de retorno de chamada também funciona.

Só quero saber por que falha com o cPickle.

Staale
fonte

Respostas:

164

As exceções já são impressas por padrão antes do encerramento do programa. Se você quiser enviar o erro para outro lugar (não imprimi-lo), pode fazer o seguinte:

try:
    something()
except Exception as e:
    send_somewhere(traceback.format_exception(*sys.exc_info()))
    raise # reraises the exception

observe que este formato usando a aspalavra-chave é para python> 2.6. A maneira antiga era:

except Exception, e:
nosklo
fonte
5
não sabia sobre a mudança "Exceção como e". "Exceção, e" sempre me incomodou, bom ver que ficou limpo.
monkut
3
A palavra-chave 'as' é para python> = 2.6
pixelbeat
Uma solução tão simples. Mesmo assim, procuro no Google a cada dois meses, clico no link do topo e acabo aqui.
niCk cAMel
3

O módulo traceback é bastante útil para formatar tracebacks. Você pode então gravá-lo em um arquivo de log.


fonte
1

Isto funciona? :

except BaseException, e:
Swaroop CH
fonte
10
Você não deve pegar BaseException- inclui SystemExite KeyboardInterruptcoisas que você geralmente não quer pegar.
nosklo