如果每个函数都没有抛出任何错误,则按顺序运行python函数

时间:2015-02-17 16:34:11

标签: python function

我想编写一个按顺序运行多个函数的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)显示错误,程序不会抛出任何异常并继续运行。

2 个答案:

答案 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()