2016-07-26 5 views
-2

Ich schrieb einen Versuch außer Block, dass ich jetzt erkannte, war eine schlechte Idee, weil es "blinde" Ausnahmen werfen, die schwer zu debuggen sind. Das Problem ist, dass ich nicht weiß, wie ich es anders schreiben soll, als jede der Methoden, die aufgerufen werden, zu durchlaufen und alle Ausnahmen manuell zu lesen und für jeden etwas vorzubringen.Wie kann ich diesen Versuch außer Block umgehen?

Wie würden Sie diesen Code strukturieren?

+3

* "alle Ausnahmen manuell lesen und einen Fall für jeden machen" * ... das ist, was Sie tun müssen. Blindes Abfangen von Ausnahmen ist niemals eine gute Idee. – solarissmoke

+2

@solarisssmoke ... Nur Ausnahme fangen, die Sie behandeln können. Nicht jede Ausnahme. Einige müssen übergangen werden. Oder der Ausnahmeblock wäre länger als der Testblock. Verwenden Sie die Ausnahme, um mehr Code als Python-Codierungsstil hinzuzufügen. – Merlin

+1

Hier gibt es viel zu wenig Informationen. Die Frage ist, unter welchen Umständen möchten Sie False zurückgeben? Der Grund dafür, dass Code schlecht ist, ist, dass er zu viele Dinge zusammenfasst und für alle möglichen Fehler Falsch zurückgibt. Um zu entscheiden, wie man es besser schreibt, müssen Sie detaillierter darüber nachdenken, was in diesem Code passieren kann und was Sie dagegen tun wollen. – BrenBarn

Antwort

0

Oft kommen Ausnahmen mit Fehlerzeichenfolgen, die verwendet werden können, um das Problem zu lokalisieren. Sie können diesen Wert zugreifen wie so:

try: 
    # code block 
except Exception as e: 
    print str(e) 

Sie können auch drucken, welche Klasse ausnahmsweise es unter Verwendung der repr Methode zusammen mit Fehlermeldungen ist:

try: 
    # code block 
except Exception as e: 
    print repr(e) 
+0

Sie können auch traceback importieren und dann traceback.print_exc() im except-Block aufrufen, um die Ausnahmeinfo zu drucken. Stack-Trace –

-1

Zuerst Code ist un-pythonic . Sie verwenden 'self' für eine Funktion. "self" ist in der Regel für eine Klasse reserviert. Also beim Lesen Ihres Codes fühlt es sich unnatürlich. Zweitens ist mein Stil zu "=" Zeichen für die Lesbarkeit ausgerichtet. Mein Rat ist, neu zu beginnen - Verwenden Sie Standard Pythonic Konventionen. Sie können dies durch gehen durch python Tutorials.

Exception werfen früh und -nur oft, wenn der Code ausgeführt wird beendet. Sie könnten auch einige der Namensgebung außerhalb des try/except Block bewegen.

def get_wiktionary_audio(self): 
    '''function for adding audio path to a definition, this is meant to be run before trying to get a specific URL''' 
    #this path is where the audio will be saved, only added the kwarg for testing with a different path 
    path    = "study_audio/%s/words" % (self.word.language.name) 
    try: 

     wiktionary_url = "http://%s.wiktionary.org/wiki/FILE:en-us-%s.ogg" % (self.word.language.wiktionary_prefix, self.word.name) 
     wiktionary_page = urllib2.urlopen(wiktionary_url) 
     wiktionary_page = fromstring(wiktionary_page.read()) 
     file_URL  = wiktionary_page.xpath("//*[contains(concat(' ', @class, ' '), ' fullMedia ')]/a/@href")[0] 
     file_number  = len(self.search_existing_audio()) 
     relative_path = '%s/%s%s.ogg' % (path, self.word.name, file_number) 
     full_path  = '%s/%s' % (settings.MEDIA_ROOT, relative_path) 
     os.popen("wget -q -O %s 'http:%s'" % (full_path, file_URL)) 

    except Exception as e : print e 


    WordAudio.objects.create(word=self.word, audio=relative_path, source=wiktionary_url) 
    return True 
+1

'self' ist ein Argument für die Funktion, was durchaus eine Methode sein kann. – BrenBarn

+0

Ist "Selbst" eine Methode im obigen Code? – Merlin

+1

Ich sage "get_wiktionary_audio" kann eine Methode sein. (Der Fragesteller mag die umschließende Klasse einfach weggelassen haben, weil sie für die Frage nach dem try/except-Block nicht relevant ist.) – BrenBarn

0

Eine Möglichkeit, wie ich darüber gehen Konfigurieren Sie Python, loggen Sie sich ein und protokollieren Sie die Ausgabe.Dies gibt Ihnen eine Menge Flexibilität in dem, was Sie mit der Protokollausgabe tun.Im folgenden Beispiel wird der Ausnahme-Traceback protokolliert:

import traceback 
import logging 

logger = logging.getLogger(__name__) 

try: 
    ... 
except Exception as e: 
    logger.exception(traceback.format_exc()) # the traceback 
    logger.exception(e) # just the exception message 
Verwandte Themen