2014-09-03 81 views
0

问题是 - 在哪里以及如何使用try/exceptif/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%肯定我明白你的问题。你是否问了一个关于在Python中正确使用try/except块的常见问题,或者你是否在问如何嵌套测试? – user590028 2014-09-03 18:06:46

+0

第二个 - 使用if/else(取决于函数退出状态)和try/except的正确方法。正如@bereal提到的 - 在Python退出状态中通常不会使用? (我的意思是 - 在bash中我可以这样做> echo'TEST'&& echo'打印'|| echo'Can not echo!'//因此 - 使用退出状态0或1) – setevoy 2014-09-03 18:13:49

回答

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

相关问题