2014-09-03 33 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

相關問題