问题是 - 在哪里以及如何使用try/except
和if/else
运营商?
例如 - 我有功能:
# 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 :(得分: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 :(得分:1)
在大文件中看起来很奇怪,有很多try / 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