Running python functions sequentially if each function doesn't throw any error
我想编写一个按顺序运行多个函数的python代码。实际上,从第一个函数开始并检查它是否没有抛出任何错误,然后开始运行第二个函数,依此类推。我使用了以下策略,但是当第一个函数抛出错误并继续运行其他函数时它没有停止:
1 2 3 4 5 6 7 8 9 | try: firstFunc() except: raise ExceptionFirst('job failed!') else: try: secondFunc() except: raise ExceptionSecond('second function failed!') |
- - - - - - - - - - - - - - - 添加在 - - - - - - - - - --------------------------
所有功能都以单独的方式定义,并且彼此之间没有连接。每个函数的结构如下(例如,第一个函数):
1 2 3 4 | p = subprocess.Popen("abaqus script=py.py", shell=True) p.communicate() #now wait if p.returncode == 0: print("job is successfully done!") |
我改变了我的功能如下,它成功地运作:
1 2 3 | p = subprocess.check_call("abaqus script=py.py", shell=True) if p == 0: print("job is successfully done!") |
但是,我对我的一个具有以下结构的函数遇到了同样的问题:
1 2 3 | p = subprocess.check_call("java -jar javaCode.jar XMLfile.xml", shell=True) if p == 0: print("job is successfully done!") |
它抛出一个错误,但python打印出"工作成功完成!"为此,并继续运行其他功能!
----------------------------------------完整代码-------- ----------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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! ") def abq_java(): p = subprocess.check_call("java -jar FisrtJavaCode.jar", shell=True) if p == 0: print("job is successfully done! ") def java_job(): p = subprocess.check_call("java -jar secondJavaCode.jar XMLfile.xml", shell=True) if p == 0: print("job is successfully done! ") 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)显示错误,程序不会抛出任何异常并继续运行。
将您的函数放入一个列表并迭代它们,调用每个函数。
1 2 3 4 5 6 7 | funcs = [firstFunc, secondFunc, ...] for func in funcs: try: func() except ValueError: # Or whatever specific exception you want to handle... # Handle it... break |
(请参阅此处,了解为什么抓住您尝试处理的特定异常会更好。)
编辑:
如果每个函数都有一组您想要捕获的特定异常,但它们的功能不同,您可以将它们放入带有这些函数的列表中。
1 2 3 4 5 6 7 8 9 10 11 | 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 |
更多编辑:
我的结构不同 - 作业之间唯一不同的是运行命令。你可以这样做:
1 2 3 4 5 6 7 8 | 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) |
如果其中一个命令设置非零返回代码,则不需要捕获可能引发的
现在听起来基本问题是
如果你只是抛出另一个异常,为什么要尝试
1 2 3 4 | firstFunc() secondFunc() thirdFunc() we_all_about_the_funk() |