Как использовать обработку ошибок с подпроцессов в Python - PullRequest
0 голосов
/ 09 октября 2018

У меня есть эта таблица в 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)

Ошибка в этом случае не может быть легко обнаружена !!

Любая идея?или, может быть, я не должен использовать попробовать, кроме как в этом случае?Я уже пробовал практически любой вид обработки ошибок!как За исключением, кроме как, OsError и т. д. !!

Обратите внимание, что я могу распечатать ошибку через stderr!если результаты стандартного вывода хорошие, я хочу выполнить первую команду !!

1 Ответ

0 голосов
/ 09 октября 2018

Вы не можете "перехватить" исключение, потому что 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])
...