我想编写一个python代码,依次运行几个函数。实际上,从第一个函数开始,检查它是否没有引发任何错误,然后开始运行第二个函数,依此类推。我使用了以下策略,但是当第一个函数抛出错误并继续运行其他函数时,它并没有停止:
try:
firstFunc()
except:
raise ExceptionFirst('job failed!')
else:
try:
secondFunc()
except:
raise ExceptionSecond('second function failed!')
- - - - - - - - - - - - - - - 添加在 - - - - - - - - - --------------------------
所有功能都以单独的方式定义,并且彼此之间没有连接。每个功能的结构如下(例如,第一功能):
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)显示错误,则程序不会引发任何异常并保持运行。
最佳答案
将您的函数放入列表中并遍历它们,分别调用它们。
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
失败时未正确设置返回码。关于python - 如果每个函数都不会引发任何错误,请依次运行python函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28566283/