2016-04-02 3 views
0

Я использую модуль подпроцесса в python для подключения своего 3G-ключа к сети 3G с помощью sakis3g.Управление ошибкой подпроцессора Python. Не удалось поймать ненулевой статус выхода

Смотрите здесь мой код используется:

check_output(['sakis3g', '--sudo', 'connect', 'OTHER="USBMODEM"', 'USBMODEM="12d1:1001"', 'APN="internet"']) 

Иногда мой ключ может измотать и дать ошибку в природе: «Это устройство не имеет возможности GSM ...»

Который я могу полностью жить, поскольку все, что ему нужно, это просто повторить попытку, и он будет работать нормально.

Однако, используя подпроцессы, я сталкиваюсь с ошибкой returned non-zero exit status, и это полностью разрушит мое программное обеспечение.

Поскольку все, что мне нужно, это повторить попытку, я попытался ввести код в try: ... except: .... Ошибка, которую я пытаюсь поймать, - subprocess.CalledProcessError, которая должна быть возвращена check_output в случае отсутствия нулевого статуса выхода в соответствии с the documentation.

Однако, это не похоже, чтобы решить эту проблему, проблема все еще сохраняется:

Traceback (most recent call last): 
    File "run.py", line 91, in <module> 
    print connect_3G() 
    File "run.py", line 28, in connect_3G 
    check_call(['sakis3g', '--sudo', 'connect', 'OTHER="USBMODEM"', 'USBMODEM="12d1:1001"', 'APN="internet"']) 
    File "/usr/lib/python2.7/subprocess.py", line 540, in check_call 
    raise CalledProcessError(retcode, cmd) 
subprocess.CalledProcessError: Command '['sakis3g', '--sudo', 'connect', 'OTHER="USBMODEM"', 'USBMODEM="12d1:1001"', 'APN="internet"']' returned non-zero exit status 95 

Так что я попытался поймать исключение в самом широком образом можно, просто используя except: и даже если сделать это, ошибка все еще возникает и сбой программного обеспечения.

Я в затруднении, пытаясь поймать эту ошибку должным образом, мог бы кто-нибудь сказать мне, что именно происходит здесь, потому что кажется, что довольно сложно ловить ошибки, вызванные подпроцессами на данный момент (для меня).

Смотрите полную функцию I, предназначенной об использовании здесь:

def connect_3G(): 
    while True: 
     check_output(['sakis3g', '--sudo', 'connect', 'OTHER="USBMODEM"', 'USBMODEM="12d1:1001"', 'APN="internet"']) 
     try: 
      return 'Connected to ip: {}'.format(json.loads(requests.get('http://httpbin.org/ip').content)['origin']) 
     except subprocess.CalledProcessError: 
      print 'Oops, problem connecting to 3G. Better retry fam.' 
+2

Похоже, за исключением выброшен на 'check_output' вызова, который не находится внутри попытки, кроме блока? – strubbly

+0

@strubbly Да, похоже, это проблема, не могу поверить, что я это пропустил! –

ответ

1

Я думаю, что вы делаете правильные вещи ... но перенесите код, который бросает исключение внутри try блока!

def connect_3G(): 
    while True: 
     try: 
      check_output(['sakis3g', '--sudo', 'connect', 'OTHER="USBMODEM"', 'USBMODEM="12d1:1001"', 'APN="internet"']) 
      return 'Connected to ip: {}'.format(json.loads(requests.get('http://httpbin.org/ip').content)['origin']) 
     except subprocess.CalledProcessError: 
      print 'Oops, problem connecting to 3G. Better retry fam.' 
+0

Welp Я не могу поверить, что не видел этого. –

1

Кроме того, просто распечатать ошибки, может помочь вам отлаживать код:

def connect_3G(): 
    while True: 
     try: 
      check_output(['sakis3g', '--sudo', 'connect', 'OTHER="USBMODEM"', 'USBMODEM="12d1:1001"', 'APN="internet"']) 
      return 'Connected to ip: {}'.format(json.loads(requests.get('http://httpbin.org/ip').content)['origin']) 
     except subprocess.CalledProcessError as error: 
      print 'Oops, problem connecting to 3G. Better retry fam.', error 
+0

Хорошее мышление, но корень этой ошибки известен мне, и я не могу решить, к сожалению. –

Смежные вопросы