2014-09-03 4 views
0

Вопрос: где и как использовать try/except и if/else операторов?Правильный способ использования функции в Python?

Для примера - у меня есть функция:

# 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!' 

функции, хранящийся в отдельном файле. Далее из сценария вызывается как:

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') 

Но - есть много функций в createvhostFuncts.py. Таким образом, у меня есть большой список звонков if/else в скрипте, и это выглядит очень ... Нечетно? Бесполезный?

Итак - какой правильный способ вызова функций и где лучше использовать try/except - внутри функции или в скрипте?

UPD:

Например - в BASH я могу использовать somethig как следующий:

#!/usr/bin/env bash 

func(){ 
     echo "Ya!" 
} 

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

И запустить его следующий результат:

$ ./m 
Ya! 
0 
Printed 

Или с ошибкой:

#!/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

Я не 100% уверен, что я понимаю ваш вопрос. Вы задаете общий вопрос о правильном использовании блоков try/except в python или спросите, как вложить тесты? – user590028

+0

Второй - правильный способ использования if/else (в зависимости от статуса выхода функции) и try/except.Как упоминал @bereal - в статусе выхода Python обычно не используется? (Я имею в виду - в bash я могу сделать> echo 'TEST' && echo 'Printed' || echo 'Can not echo!' // таким образом - там был статус завершения процесса 0 или 1) – setevoy

ответ

2

В Python они обычно не используют возвращаемое значение функции для обозначения статуса успеха (например, они выполняются на C или Go), а функция должна вызывать исключение, если что-то пойдет не так.

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

Вы можете перехватить исключение из вызывающей стороны (в пределах вашего сценария) или пусть он провалится, что в вашем случае будет вызывать завершение сценария с трассировки стека. Затем вам не нужно обертывать каждый звонок try..except.

(сторона примечание) Если вы не хотите трассировки стека, который будет отображаться, вы можете использовать sys.excepthook, как это:

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

sys.excepthook = report 
1

Это может выглядеть странно в большом файле, чтобы иметь много попробовать/блоки catch. Согласен, что это приемлемо, и функции должны вызывать ошибку вместо возврата значений для обозначения успеха или неудачи.

Если ошибка не отбрасывается вы будете продолжать, как нормальный

Вот как я буду писать код. В обоих случаях он достигает конца сценария:

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 

Это определенно работа читает official python documentation