Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    gestire eccezioni python

    Salve a tutti, stò utilizzando la libreria lightblue (invio di file tramite bluetooth) e ho questo problema:
    devo gestire il caso che il messaggio sia stato declinato dal destinatario e il caso che non l'abbia scaricato perchè non se ne è accorto (con successiva scadenza del timeout del messaggio)..ho fatto delle prove e ho visto che il primo caso restituisce:
    lightblue._obexcommon.OBEXError: (111, 'Connection refused')
    mentre il secondo caso:
    lightblue._obexcommon.OBEXError: (11, 'Resource temporarily unavailable')

    riesco a gestire in maniera diversa queste eccezioni:
    try:
    lightblue.obex.sendfile(device.getAddr(), c[1],"advertisement.jpg")
    except lightblue._obexcommon.OBEXError????????????:
    print "Il Destinatario non ha accettato il file!"
    except lightblue._obexcommon.OBEXError????????????:
    print "Il Destinatario non ha scaricato il file!"

  2. #2
    Se osservi bene le due eccezioni noterai come esse abbiano due codici di errore differenti, ed è proprio su quelli che devi andare ad agire.
    Riguardo il come dipende da come la classe OBEXError ti permette di accedere al valore di codice di errore, e questo o lo vedi sulla documentazione o piu' semplicemente guardando il codice della classe OBEXError.

    Solitamente il codice di errore è fornito sotto forma di attributo e ci puoi accedere in questo modo:

    codice:
    try:
         foo()
    except ErroreDiQualcheTipo, err:
         print err.errno
    ..per cui:

    codice:
    try:
        lightblue.obex.sendfile(device.getAddr(), c[1],"advertisement.jpg")
    except lightblue._obexcommon.OBEXError, err:
        if err.errno == 111:
             print "non ha accettato il file"
        elif err.errno == 11:
             print "non ha scaricato il file"
        else:
             raise

    ...però non è detto che esista "errno", magari lo hanno chiamato "errorcode" o in qualche altro modo, oppure non l'hanno definito proprio e ci accedi tramite slicing in questo modo:

    codice:
    try:
       foo()
    except lightblue._obexcommon.OBEXError, err:
        print err[0]  # codice di errore 
        print err[1]  # stringa di errore
    Insomma, è un qualcosa che è a discrezione di chi ha sviluppato l'API.
    Utilizzando dir() o help() sulla classe di errore puoi comunque facilmente vedere come hanno impostato la cosa e come regolarti di conseguenza.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  3. #3
    grazie molto gentile.

    da shell ho cercato di vedere il codice della classe con help (OBEXError) ma niente da fare non c'è pydoc, quindi ho provato con dir e mi restituisce questo:
    >>> dir (OBEXError)
    ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__getit
    em__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_
    ex__', '__repr__', '__setattr__', '__setstate__', '__str__', '__weakref__', 'arg
    s', 'errno', 'filename', 'message', 'strerror']
    Quindi a quanto pare c'è errno, ho inserito il tuo pezzo di codice ma non succedeva niente, ho fatto quindi una print di err.errno all'interno del blocco except e il risultato è None..
    ho fatto una print anche di message e di strerror, message contiene il messaggio (11,'....') mentre anche strerror contiene None.
    E su google non riesco a trovare una straccio di documentazione su questa classe..

  4. #4
    ho provato a fare slicing, e il risultato è curioso, visualizzando solo il contenuto di err[0] mi ritorna tutto il messaggio di errore (111, 'Connection refused') mentre con print err[1] mi da out of range...non è fatta molto bene questa classe mi sembra

  5. #5
    Cercando su Google code search pare che OBEXError derivi da IOError.
    Prova a guardare il punto in cui il codice la solleva (lo vedi dal traceback) e guarda come hanno fatto.

    Se errno è None usa semplicemente err[0] o err.message[0] (quella che funziona, non so quale delle due) e sei a cavallo.
    Insomma, paciocca un po' finchè non trovi come tirare fuori il codice di errore. A te è quello che serve.

    Altra finezza: da qualche parte nella libreria è probabile che siano definite le costanti dei codici di errori.
    Usa quelle invece che 111 e 11. Es:

    if err[0] == EINVAL

    ...invece di

    if err[0] == 111
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  6. #6
    si si infatti ho usato err.message e tanti saluti a babbo satanasso.
    ti ringrazio, problema risolto!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.