2016-04-02 8 views
0

私はsakis3gを使用して私の3Gドングルを3Gネットワ​​ークに接続するためにpythonのサブプロセスモジュールを使用しています。Pythonのサブプロセスエラー管理。ゼロ以外の終了ステータスをキャッチすることができません

「...このデバイスは、任意のGSM機能を持っていない」

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

機会に私のドングルが出うんちとの自然の中でエラーを与える可能性があります

は私のコードが使用され、ここを参照してください。

私は完全にそれが必要なので、簡単に再試行とそれは通常うまく動作しますと一緒に暮らすことができます。

ただし、サブプロセスを使用するとエラーreturned non-zero exit statusが発生し、ソフトウェアが完全にクラッシュします。

私は再試行が必要なので、私はtry: ... except: ...でコードしようとしました。 私がキャッチしようとしているエラーは、です。これは、による0以外の終了ステータスの場合には、check_outputによって返されます。

はしかし、問題を解決していないようでしたこと、問題が解決しない:

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:を使用することにより、可能な最も広い方法で例外をキャッチしようとしたこれを実行した場合でも、エラーは引き続き発生し、ソフトウェアをクラッシュさせます。

私はこのエラーを正しくキャッチしようとしていますが、この時点で(私にとって)サブプロセスによって引き起こされたエラーを検出するのはむしろ難しいと思われるので、誰にでも正確に何が起きているか教えてください。

は、私がここで使用して意図した完全な機能を参照してください:

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

ウェルプ私はそれを見ていないとは信じられません。 –

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

良い考えですが、このエラーの根本は私には分かっており、残念なことに解決できるものではありません。 –

関連する問題