2016-07-26 9 views
-2

デバッグするのが難しい「ブラインド」例外を投げつけ続けるので、私が今気づいているtry exceptブロックを書いたのは悪い考えでした。問題は、呼び出されるメソッドのそれぞれを通過し、すべての例外を手動で読み込み、それぞれのケースを作成する以外に、別の方法で記述する方法を知りません。ブロックを除いてこのtry tryを回避する方法はありますか?

このコードをどのように構造化しますか?

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: 
     return False 

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

*「手動ですべての例外を読み、それぞれのケースを作成する」* ...これは実行する必要があります。盲目的に例外をキャッチすることは決して良い考えではありません。 – solarissmoke

+2

@solarissmoke ...処理できる例外のみをキャッチします。すべての例外ではありません。いくつかは渡される必要があります。または、exceptブロックはtryブロックよりも長くなります。コードを追加するために例外を使用してPythonのコーディングスタイルです。 – Merlin

+1

ここにはあまり情報がありません。問題は、どのような状況でFalseを返したいのですか?コードが悪い理由は、あまりにも多くのものを一括して扱い、すべての可能なエラーに対してFalseを返すことです。それをより良く書く方法を決定するには、そのコードで何が起こる可能性があり、何をしたいのかをより詳細に考える必要があります。 – BrenBarn

答えて

0

多くの場合、例外を特定するために使用できるエラー文字列があります。あなたはそうのように、この値にアクセスすることができます。

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

ます。また、それはreprメソッドを使用して、すべてのエラーメッセージと一緒にされた例外のどのクラス印刷することができます。

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

また、トレースバックをインポートしてexceptブロック内のtraceback.print_exc()を呼び出して例外情報とスタックトレースを出力することもできます –

-1

まず、あなたのコードは非ニシキヘビです。関数に'self'を使用しています。 "self"は通常クラス用に予約されていますので、コードを読む際には不自然な感じがします。次に、私のスタイルは"="の記号を読みやすくするためです。私はそれについて移動したいとPythonのチュートリアルを通過する。

スロー例外コードが実行して停止したときに早期かつ頻繁に-only。あなたはまた、try/exceptブロックの外側命名の一部を移動することができます。

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'は関数の引数であり、メソッドでもあります。 – BrenBarn

+0

上記のコードで「自己」メソッドですか? – Merlin

+1

私は 'get_wiktionary_audio'が方法かもしれないと言っています。 (質問者は、try/exceptブロックに関する質問と密接に関連していないので、囲むクラスを省略している可能性があります。) – BrenBarn

0

一つの方法Pythonのロギングを設定して出力をログ出力するので、ログ出力の柔軟性が向上します。以下の例では、例外のトレースバックを記録しています。

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 
関連する問題