python - 如何在python中的子流程中使用错误处理

标签 python for-loop error-handling

我在postgres中有此表:

  remote-as           IRR-record
+==========+=====================================+
   12564   +      MAIyNT-AS38082                 +     
+==========+=====================================+
   32934   +      AS-FACEBOOK                    +
+==========+=====================================+

我想遍历该表并执行命令!如果命令失败,我想使用第二条命令
for row in c: #this will iterate through the table
try:
    res = subprocess.Popen('bgpq3 -4 {} -m 24 -l {}'.format(row[5],row[2]), shell=True, universal_newlines=True,
    stdout=subprocess.PIPE).communicate()[0]

except Exception:
     print("error detected")
     res = subprocess.Popen('bgpq3 -4 AS{} -m 24 -l {}'.format(row[2],row[2]), shell=True, universal_newlines=True,
     stdout=subprocess.PIPE).communicate()[0]

在某些情况下,第一个命令将导致错误,因此必须应用第二个命令!

如果没有错误发生,结果是:
ip prefix-list 38082 permit 223.27.237.0/24
ip prefix-list 38082 permit 223.27.240.0/24
ip prefix-list 38082 permit 223.27.241.0/24

错误的结果是:
ERROR:Unable to parse prefix 'MAIyNT-AS38082', af=2 (inet), ret=0
ERROR:Unable to parse prefix MAIyNT-AS38082
ERROR:Unable to add prefix MAIyNT-AS38082 (bad prefix or address-family)

在这种情况下,错误很容易被发现!

任何想法?或者也许我不必使用try并且在这种情况下除外?
我已经尝试了几乎所有类型的错误处理!像Except一样,除了OsError等!

请注意,我能够通过stderr打印错误!如果stdout的结果很好,我想执行第一个命令!

最佳答案

您无法“捕获”异常,因为subprocess.Popen不会引发任何异常。

如果所有错误消息(bgpq3返回的错误消息)都以“ERROR:”前缀开头,则可以尝试以下代码。

for row in c:
    try:
        res = subprocess.Popen('bgpq3 -4 {} -m 24 -l {}'.format(row[5],row[2]), shell=True, universal_newlines=True,
        stdout=subprocess.PIPE).communicate()[0]

        if res.startswith("ERROR:"):
            res = subprocess.Popen('bgpq3 -4 AS{} -m 24 -l {}'.format(row[2],row[2]), shell=True, universal_newlines=True,
            stdout=subprocess.PIPE).communicate()[0]
        print(res)

     except Exception:
         print("Exception Detected for %s", row[2])

关于python - 如何在python中的子流程中使用错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52716432/

相关文章:

python - 在这种情况下如何从多个 csv 文件读取数据并生成报告?

python - scipy中缺少ndimage

JAVA嵌套循环用法

javascript - 是否可以防止将特定的 JavaScript 错误写入控制台?

arrays - 程序给出信号 SIGABRT : Process abort signal in one code and does not in other code

python - 如何在 SPARQL regex() 中使用逻辑或?

python - 在 Win32 上为 Python 2.6 编译 MySQLdb 时出现问题

c++ - 带有用户定义数组的 for 循环 - C++

r - 使用 R、RCurl 进行多 Web 表挖掘

php - PDO错误处理,可以吗?