我在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的结果很好,我想执行第一个命令!
答案 0 :(得分:0)
您无法“捕获”异常,因为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])