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

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)

如果其中一个命令设置非零返回代码,则不需要捕获可能引发的subprocess.CalledProcessError - 这将停止按您希望的方式处理。

现在听起来基本问题是java -jar javaCode.jar XMLfile.xml在失败时没有正确设置返回代码。


如果你只是抛出另一个异常,为什么要尝试try/except?如果您之后尝试停止执行,请让原始异常冒泡。

1
2
3
4
firstFunc()
secondFunc()
thirdFunc()
we_all_about_the_funk()