我想编写一个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/

10-11 02:56
查看更多