Pergunta

Gostaria de saber como eu sair do Python sem ter um despejo de rastreamento na saída.

Eu ainda quero quero ser capaz de retornar um código de erro, mas eu não quero exibir o log de rastreamento.

Eu quero ser capaz de sair usando exit(number) sem deixar rasto, mas no caso de uma exceção (não uma saída) Eu quero o rastreamento.

Foi útil?

Solução

Você está presumivelmente encontrar uma exceção e o programa é sair por causa disso (com um traceback). A primeira coisa a fazer, portanto, é pegar essa exceção, antes de sair de forma limpa (talvez com uma mensagem, exemplo dado).

Tente algo como isso em sua rotina main:

import sys, traceback

def main():
    try:
        do main program stuff here
        ....
    except KeyboardInterrupt:
        print "Shutdown requested...exiting"
    except Exception:
        traceback.print_exc(file=sys.stdout)
    sys.exit(0)

if __name__ == "__main__":
    main()

Outras dicas

Talvez você está tentando capturar todas as exceções e isso é captura a exceção SystemExit levantada por sys.exit()?

import sys

try:
    sys.exit(1) # Or something that calls sys.exit()
except SystemExit as e:
    sys.exit(e)
except:
    # Cleanup and reraise. This will print a backtrace.
    # (Insert your cleanup code here.)
    raise

Em geral, usando except: sem nomear uma exceção é uma idéia ruim. Você vai pegar todos os tipos de coisas que você não quer pegar - como SystemExit - e também pode mascarar seus próprios erros de programação. Meu exemplo acima é bobagem, a menos que você está fazendo algo em termos de limpeza. Você poderia substituí-lo com:

import sys
sys.exit(1) # Or something that calls sys.exit().

Se você precisa para sair sem levantar SystemExit:

import os
os._exit(1)

Eu faço isso, em código que é executado sob unittest e chama fork(). Unittest começa quando o processo bifurcada levanta SystemExit. Este é definitivamente um caso de canto!

import sys
sys.exit(1)

algo como import sys; sys.exit(0)?

O código a seguir não vai gerar uma exceção e vai sair sem um rastreamento:

import os
os._exit(1)

Veja esta pergunta e respostas relacionadas para mais detalhes. Surpreendido por todas as outras respostas são tão demasiado complicada.

É muito melhor prática para evitar o uso sys.exit () e em vez exceções raise / punho para permitir que o programa para terminar de forma limpa. Se você deseja desativar rastreamento, basta usar:

sys.trackbacklimit=0

Você pode definir isso no topo do seu script para esmagar toda a saída de rastreamento, mas eu prefiro usá-lo com mais moderação, por exemplo "erros conhecidos" onde eu quero a saída para ser limpo, por exemplo, na foo.py arquivo:

import sys
from subprocess import *

try:
  check_call([ 'uptime', '--help' ])
except CalledProcessError:
  sys.tracebacklimit=0
  print "Process failed"
  raise

print "This message should never follow an error."

Se CalledProcessError é capturado, a saída será parecido com este:

[me@test01 dev]$ ./foo.py
usage: uptime [-V]
    -V    display version
Process failed
subprocess.CalledProcessError: Command '['uptime', '--help']' returned non-zero exit status 1

Se ocorrer qualquer outro erro, nós ainda obter a saída de rastreamento completo.

Use o built-in função de python quit () e é isso. Não há necessidade de importar qualquer biblioteca. Eu estou usando python 3.4

Gostaria de fazê-lo desta maneira:

import sys

def do_my_stuff():
    pass

if __name__ == "__main__":
    try:
        do_my_stuff()
    except SystemExit, e:
        print(e)

E

import sys
....
....
....
sys.exit("I am getting the heck out of here!")

No rastreamento e de alguma forma mais explícita.

# Pygame Example  

import pygame, sys  
from pygame.locals import *

pygame.init()  
DISPLAYSURF = pygame.display.set_mode((400, 300))  
pygame.display.set_caption('IBM Emulator')

BLACK = (0, 0, 0)  
GREEN = (0, 255, 0)

fontObj = pygame.font.Font('freesansbold.ttf', 32)  
textSurfaceObj = fontObj.render('IBM PC Emulator', True, GREEN,BLACK)  
textRectObj = textSurfaceObj.get_rect()  
textRectObj = (10, 10)

try:  
    while True: # main loop  
        DISPLAYSURF.fill(BLACK)  
        DISPLAYSURF.blit(textSurfaceObj, textRectObj)  
        for event in pygame.event.get():  
            if event.type == QUIT:  
                pygame.quit()  
                sys.exit()  
        pygame.display.update()  
except SystemExit:  
    pass
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top