【问题标题】:How to use error handling with subproces in python如何在python中使用子进程的错误处理
【发布时间】:2019-03-13 23:03:31
【问题描述】:

我在 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,except as,OsError等等!!

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

【问题讨论】:

标签: python for-loop error-handling


【解决方案1】:

您无法“捕获”异常,因为 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])

【讨论】:

    猜你喜欢
    • 2019-06-10
    • 2021-02-22
    • 2011-06-04
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    相关资源
    最近更新 更多