我想编写一个按顺序运行多个函数的python代码。实际上,从第一个函数开始并检查它是否没有抛出任何错误,然后开始运行第二个函数,依此类推。我使用了以下策略,但是当第一个函数抛出错误并继续运行其他函数时它没有停止:
try:
firstFunc()
except:
raise ExceptionFirst('job failed!')
else:
try:
secondFunc()
except:
raise ExceptionSecond('second function failed!')
------------------------------ ADD-ON -------------- -----------------------------
所有功能都以单独的方式定义,并且彼此之间没有联系。每个函数的结构如下(例如,第一个函数):
p = subprocess.Popen("abaqus script=py.py", shell=True)
p.communicate() #now wait
if p.returncode == 0:
print("job is successfully done!")
我改变了我的功能如下,它成功运作:
p = subprocess.check_call("abaqus script=py.py", shell=True)
if p == 0:
print("job is successfully done!")
但是,对于我的一个具有以下结构的函数,我遇到了同样的问题:
p = subprocess.check_call("java -jar javaCode.jar XMLfile.xml", shell=True)
if p == 0:
print("job is successfully done!")
它会抛出一个错误,但是python打印出来"工作已成功完成!"为此,继续运行其他功能!!
----------------------------------------完整代码----- -------------------------------------------
import subprocess
import sys, os
def abq_script():
p = subprocess.check_call("abaqus script=py.py", shell=True)
if p == 0:
print("job is successfully done!\n")
def abq_java():
p = subprocess.check_call("java -jar FisrtJavaCode.jar", shell=True)
if p == 0:
print("job is successfully done!\n")
def java_job():
p = subprocess.check_call("java -jar secondJavaCode.jar XMLfile.xml", shell=True)
if p == 0:
print("job is successfully done!\n")
def abq_python_java():
funcs = [abq_script, abq_java, java_job]
exc = Exception('job failed!')
for func in funcs:
try:
func()
except Exception as e:
print(str(e))
break
如果第一个或第二个函数显示错误,则异常抛出异常并且程序停止运行。但是,如果最后一个函数(java_job)显示错误,程序不会抛出任何异常并继续运行。
答案 0 :(得分:4)
将你的函数放入一个列表并迭代它们,调用每个函数。
funcs = [firstFunc, secondFunc, ...]
for func in funcs:
try:
func()
except ValueError: # Or whatever specific exception you want to handle...
# Handle it...
break
(See here讨论为什么抓住你想要处理的特定异常会好得多。)
修改强>
如果每个函数都有一组您想要捕获的特定异常,但它们的功能不同,您可以将它们放入带有这些函数的列表中。
funcs = [
(firstFunc, (ValueError, TypeError)),
(secondFunc, (ZeroDivisionError, NameError)),
# More function and their exceptions here...
]
for func, exceptions_to_catch in funcs:
try:
func()
except exceptions_to_catch:
# Handle it...
break
更多编辑
我的结构不同 - 作业之间唯一不同的是运行命令。你可以这样做:
commands = [
"abaqus script=py.py",
"java -jar FisrtJavaCode.jar",
"java -jar javaCode.jar XMLfile.xml",
]
for command in commands:
subprocess.check_call(command, shell=True)
print 'command {!r} successfully done!'.format(command)
如果其中一个命令设置非零返回代码,则不需要捕获可能引发的subprocess.CalledProcessError
- 这将停止按您希望的方式处理。
现在听起来基本的问题是java -jar javaCode.jar XMLfile.xml
在失败时没有正确设置返回代码。
答案 1 :(得分:1)
如果您只是再次抛出另一个例外,为什么要尝试try/except
?如果您之后尝试停止执行,请让原始异常冒泡。
firstFunc()
secondFunc()
thirdFunc()
we_all_about_the_funk()