2010-01-27 6 views
8

Cuál es la diferencia entre generar una excepción y simplemente imprimir un error.¿Hay alguna excepción a la impresión?

Por ejemplo, cuál es el beneficio de usar la siguiente:

if size < 0: 
     raise ValueError('number must be non-negative') 

en lugar de simplemente:

if size < 0: 
     print 'number must be non-negative' 

yo soy un novato, por favor tome con calma en mí. :)

+3

Cuando probó este código, ¿qué diferencias observó? –

Respuesta

8

Raising an error se detiene todo el programa en ese momento (a menos que se detecta la excepción), mientras que printing el mensaje simplemente escribe algo a stdout - la salida podría ser conducido a otra herramienta, o alguien que no se esté ejecutando la aplicación de la línea de comando, y la salida print puede que nunca se vea.

Por ejemplo, ¿qué pasaría si su código es como:

if size < 0: 
    print 'size must be non-negative' 
else: 
    print size * 4 

y yo llame a su guión como:

number_source.txt yours.py | sum_all_lines.sh

Si yours.py genera texto sin formato entre números, entonces quizás mi sum_all_lines.sh falle porque estaba esperando todos los números. Sin embargo, si yours.py se cierra debido a una excepción, entonces sum_all_lines.sh no terminará, y me quedará claro por qué falló la suma.

Por supuesto, eso es sólo un ejemplo, y su caso particular puede ser completamente diferente.

+2

Omitió esto: http: //docs.python.org/reference/simple_stmts.html#the-raise-statement y http://docs.python.org/reference/simple_stmts.html#the-print-statement. –

6

Depende si puede manejar size < 0 en el punto donde se detecta size < 0.

Si se puede manejar mediante la impresión de inmediato, entonces print, de lo contrario, provocar una excepción, para delegar el manejo de esa condición a algo más arriba en la pila de llamadas, así:

def divide_three_by(val): 
    if val == 0: 
    raise ValueError("Can't divide by 0") 
    return 3/val 

try: 
    divide_three_by(some_value_from_user) 
except ValueError: 
    print "You gave stupid input" 

En el (reconocidamente muy artificioso) ejemplo anterior, la función divide_three_by no sabe qué hacer si pasa 0 - a veces es posible que desee imprimir un mensaje (por ejemplo, si val proviene de la entrada del usuario), a veces es posible que desee ignorarlo y asigne un valor predeterminado Como la función no sabe qué hacer, debe pasar la responsabilidad de manejar esa condición por la pila de llamadas a lo que se llame (y si no se puede manejar allí, se seguirá pasando por la pila de llamadas hasta que algo lo maneje). , o hasta que alcance el nivel superior, en cuyo punto finalizará su programa).

Para obtener más información sobre el manejo de excepciones en Python, consulte la Errors and Exceptions tutorial en la documentación de Python.

+0

Probablemente debería señalar que mi ejemplo es * extremadamente artificial *, dada la existencia de 'ZeroDivisionError' (http://docs.python.org/library/exceptions.html#exceptions.ZeroDivisionError) –

2

La diferencia clave es si el programa continuará o no ejecutándose después de la comprobación de errores.

Para este caso:

if size < 0: 
    print 'number must be non-negative' 

Esto acaba de imprimir el mensaje a la salida estándar y el programa continuará más allá de su control.Entonces, si en algún momento más adelante en su código usa size y es menor que 0, puede recibir un error.

Para el otro caso:

if size < 0: 
    raise ValueError('number must be non-negative' 

En este caso, el programa no continuará más allá de su control, se lanzará una excepción. Si no se maneja, todo el programa terminará.

La mayoría de las veces tendrá que hacer una excepción y tener un controlador externo de excepciones que capte la excepción y le diga el uso del error y, si es posible, vuelva a ingresar la entrada.

3

Otra consideración es cuando se desarrolla un módulo que puede usarse en otros programas. En ese caso, es preferible lanzar una excepción y dejar que el código de llamada maneje el error. La persona que llama debería saber que algo salió mal y actuar en consecuencia.

... richie

Cuestiones relacionadas