La pregunta es: ¿dónde y cómo usar los operadores try/except y if/else?

Por ejemplo, tengo función:

# copy php.cgi script
def cpcgi(src, dst):
        try:
                shutil.copy(src, dst)
                if os.path.isfile(dst + '/php.cgi'):
                        return True
        except:
                print 'Something going wrong!'

Función almacenada en un archivo separado. A continuación, desde el script se llama así:

import createvhostFuncts as fun

print 'Copying php.cgi file...'
if fun.cpcgi(vdir + 'php-cgi/php.cgi', (vdir + 'php-cgi/' + username + '/' + domain)):
        print 'Done.\n'
else:
        exit('Error! Exit now.\n')

Pero, hay muchas funciones en createvhostFuncts.py. Por lo tanto, tengo una gran lista de llamadas if/else en el script y se ve muy ... ¿Extraño? ¿Inútil?

Entonces, ¿qué forma correcta de llamar a las funciones y dónde usar mejor try/except - dentro de la función, o en el script?

UPD :

Por ejemplo, en BASH puedo usar algo como lo siguiente:

#!/usr/bin/env bash

func(){
        echo "Ya!"
}

if func; then
        echo $?
        echo "Printed"
else
        echo $?
        echo "Can't echo!"
fi

Y ejecútelo con el siguiente resultado:

$ ./m
Ya!
0
Printed

O con error:

#!/usr/bin/env bash

func(){
        eCCCcho "Ya!"
}

if func; then
        echo $?
        echo "Printed"
else
        echo $?
        echo "Can't echo!"
fi


$ ./m
./m: line 4: eCCCcho: command not found
127
Can't echo!
0
setevoy 3 sep. 2014 a las 21:54

2 respuestas

La mejor respuesta

En Python, generalmente no usan el valor de retorno de la función para denotar el estado de éxito (como lo hacen en C o Go), sino que la función debería generar una excepción si algo sale mal.

def cpcgi(src, dst):
    shutil.copy(src, dst)
    if not os.path.isfile(dst + '/php.cgi')
        raise WhateverError("Failed to copy {0}".format(src))

Puede interceptar la excepción desde el lado de la llamada (dentro de su secuencia de comandos) o dejarla caer, lo que en su caso provocará la terminación de la secuencia de comandos con un seguimiento de la pila. Entonces no necesita ajustar todas las llamadas con try..except.

(Una nota al margen) Si tampoco desea que se muestre el seguimiento de la pila, puede usar sys.excepthook, así:

def report(type, value, traceback):
    print "Error during execution {0}".format(value)

sys.excepthook = report
2
bereal 3 sep. 2014 a las 18:11

Puede parecer extraño en un archivo grande tener muchos bloques try / catch. Se acuerda que esto es aceptable y que las funciones deberían arrojar un error en lugar de devolver valores para denotar éxito o fracaso.

Si no se produce ningún error, continúa como de costumbre

Así es como estaría escribiendo su código. En ambos casos llega al final del guión:

def cpcgi(src, dst):
    shutil.copy(src, dst)
    if not os.path.isfile(dst + '/php.cgi'):
        raise FailedCopyError("Could not copy {} to {}".format(src,dst))

import createvhostFuncts as fun

print 'Copying php.cgi file...'
try:
    fun.cpcgi(vdir + 'php-cgi/php.cgi', (vdir + 'php-cgi/' + username + '/' + domain)):

    # We have not encountered any errors so continue within the same code block

    a = 10
    b = 20
    c = 30

    # We encountered no errors

except FailedCopyError as e:
    # We have encountered an errof so break out of the try block.
    # We do not re-enter the try block, continue below.
    print(e) # This will print more information about the error


# We can continue here

print('The Try/Catch took care of everything')
print('Continue as if nothing happened')
d = 40
e = 50

Definitivamente es trabajo leer la documentación oficial de Python

1
Mike 3 sep. 2014 a las 18:53