2017-07-22 3 views
0

Pour me connecter au réseau depuis mon Raspberry Pi, j'utilise this python library. Mon problème est que je reçois constamment ConnectionError, même si je le gère dans try/except block, ou du moins je pense que je gère. Ce programme analyse l'interface radio pour les réseaux Wi-Fi, puis exclut ceux sans préfixe correspondant, puis trie les correspondants par qualité de signal. Après cela, connectToGateway() essaie de se connecter au meilleur et s'il échoue, il cherche le second dans la liste et ainsi de suite. Si le schéma d'un réseau a été enregistré auparavant, il le réutilise (c'est ce que gère l'exception AssertionError). Mon code:Obtenir ConnectionError, tout en essayant de se connecter au réseau wifi en utilisant python

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() 

Et les résultats: enter image description here

il semble donc que ça ne pas attraper cette erreur.

Répondre

1

Ce ConnectionError est ne pas être pris parce qu'il est pas soulevée par l'appel scheme.activate() dans la section try, il est d'être soulevé par l'appel scheme.activate() à la ligne 52, à l'intérieur de la section except AssertionError.

Je suppose que les documents du module wifi vous disent d'attraper AssertionError comme ça, mais c'est un peu bizarre. AssertionError est destiné à être utilisé pour attraper les bogues logiques dans les programmes, IOW, choses qui devraient jamais arriver si la logique du programme est correcte, il n'est pas censé être utilisé pour attraper des mauvaises données ou de mauvaises conditions d'environnement. Donc, normalement, si un programme augmente AssertionError c'est un signe que le programme lui-même a besoin d'être réparé.

Je ne suis pas familier avec ce module wifi, donc je ne sais pas comment résoudre votre problème. Mais le code semble avoir des problèmes pour activer le schéma renvoyé par l'appel Scheme.find à l'intérieur de cette section except AssertionError. Je suppose que vous pouvez mettre tout ce try.. except block à l'intérieur d'une boucle while avec un petit délai à la fin, et continuez à boucler jusqu'à ce que vous obteniez une connexion fonctionnelle.

+0

Cette librairie est plutôt petite et ne couvre pas toutes les erreurs correctement, donc attraper 'AssertionError' de cette façon est ma solution de contournement. Je ne sais pas si votre idée de placer le bloc try try dans une boucle while corrigera quoi que ce soit, mais vous m'avez indiqué dans la bonne direction - j'ai réussi à résoudre ce problème en ajoutant simplement un bloc try try autour de la ligne 52 , alors maintenant quand 'scheme.activate()' déclenche une erreur, il est géré correctement. – PotatoBox