2017-07-22 10 views
0

私のRaspberry Piからネットワークに接続するには、this python libraryを使用しています。私の問題は、私がConnectionErrorを常に取得していることです。try/exceptブロックで処理していても、少なくとも処理していると思います。 このプログラムは、Wi-Fiネットワーク用のエアインタフェースをスキャンし、接頭辞が一致しないものを除外し、一致するものを信号品質でソートします。その後、connectToGateway()は最良のものに接続しようとしていて、失敗した場合はリスト内の2番目のものを探します。前に保存したネットワークのスキームがある場合、再利用します(AssertionError例外が処理しているものです)。 マイコード:Pythonを使用してwifiネットワークに接続しようとしているときにConnectionErrorが発生する

from wifi import Cell, Scheme 
from collections import namedtuple 
from operator import attrgetter 
from wifi.exceptions import ConnectionError 
from optparse import OptionParser 


class NetworkConnection: 
    def __init__(self, prefix, interface, password): 
     self.prefix = prefix 
     self.interface = interface 
     self.password = password 

    def discover_avalible_networks(self, interface=None): 
     all_networks = [] 
     interface = self.interface 
     avalible_networks = Cell.all(interface) 
     for network in avalible_networks: 
      all_networks.append(network) 
     return all_networks 

    def select_appropriate_networks(self, prefix=None): 
     appropriate_network = namedtuple('network', 'ssid quality encrypted encryption_type') 
     appropriate_networks = [] 
     prefix = self.prefix 
     for network in self.discover_avalible_networks(): 
      if network.ssid.startswith(prefix): 
       appropriate_networks.append(
       appropriate_network(network.ssid, network.quality, network.encrypted, network.encryption_type)) 
     return appropriate_networks 

    def sort_appropriate_networks(self): 
     unsorted_appropriate_networks = self.select_appropriate_networks() 
     sorted_appropriate_networks = sorted(unsorted_appropriate_networks, key=attrgetter('quality'), reverse=True) 
     return sorted_appropriate_networks 

    def connect_to_gateway(self, interface=None, password=None): 
     interface = self.interface 
     password = self.password 
     networks = self.sort_appropriate_networks() 
     for network in networks: 
      try: 
       print("Trying to connect to {}").format(network.ssid) 
       scheme = Scheme.for_cell(interface, network.ssid, network, password) 
       scheme.save() 
       scheme.activate() 
       print("Connected to {}").format(network.ssid) 
       break 
      except AssertionError: 
       scheme = Scheme.find(interface, network.ssid) 
       scheme.activate() 
       print("Connected to {}").format(network.ssid) 
       break 
      except ConnectionError: 
       print("Couldn't connect to {}").format(network.ssid) 
       scheme = Scheme.find(interface, network.ssid) 
       scheme.delete() 
       continue 

if __name__ == "__main__": 
    parser = OptionParser() 
    parser.add_option('-p', '--prefix', dest='prefix', help="Specify gateway ssid prefix") 
    parser.add_option('-i', '--interface', dest='interface', help="Specify name of wireless interface of choice") 
    parser.add_option('-q', '--password', dest='password', 
         help="Specify password for the wireless network of choice") 
    options, args = parser.parse_args() 
    wireless_connection = NetworkConnection(prefix=options.prefix, interface=options.interface, 
              password=options.password) 
    wireless_connection.connect_to_gateway() 

そして結果:それは、このエラーをキャッチしていないよう enter image description here

だからそれが見えます。それはtryセクション内scheme.activate()コールによって提起されていないので、ConnectionErrorがキャッチされていない、それはexcept AssertionErrorセクション内、ライン52上のscheme.activate()コールによって提起されているということ

答えて

1

wifiモジュールのドキュメントでは、そのようなAssertionErrorをキャッチするように指示していますが、少し奇妙です。 AssertionErrorは、プログラムロジックのバグを捕捉するためのもので、IOW、は絶対にになるはずです。プログラムロジックが正しい場合、悪いデータや悪い環境条件を捕まえるために使用されていません。したがって、通常、プログラムがAssertionErrorを発行した場合、それはプログラム自体が修正する必要があるという兆候です。

私はそのモジュールwifiに慣れていないので、問題を正しく修正する方法がわかりません。しかし、そのコードは、そのexcept AssertionErrorセクション内のScheme.findコールによって返されたSchemeをアクティブ化する際に問題があるようです。あなたは、の全体をwhileのループの中に入れて、少し遅れてループを終わらせることができたと思います。

+0

このlibaryはかなり小さく、すべてのエラーを適切にカバーしていないので、このように 'AssertionError'をキャッチするのが私の回避策です。 'while'ループに' try except'ブロックを置くことについての考えが何かを修正するかどうかは分かりませんが、正しい方向に私を指摘しました。 'try except'ブロックを行52の周りに追加することでこの問題を解決することができましたしたがって、 'scheme.activate()'がエラーを発生させると、正しく処理されています。 – PotatoBox

関連する問題