2012-01-26 6 views
3

それでは、私は、このPythonコードを持っているとしましょう:一般的な例外を吹き飛ばしたいのですが、私はPythonで何をしますか?

def loopForEachFileInDirectory(self, conn): 
    for filename in os.listdir(uploadedFilesDirectory): 
     try: 
      self.insertNewEntryForStagingFile(conn, filename) 
      self.copyFilesToStagingDirectory(filename) 
     except: ??? 

def copyFilesToStagingDirectory(self, filename): 
    logging.info("copying %s to youtube_ready",filename) 
    try: 
     shutil.copy(uploadedFilesDirectory+filename, stagingDirectory) 
     logging.info("move successful") 
    except shutil.Error,e: 
     logging.warn("move failed for reasons \n\t%d:%s", e.args[0],e.args[1]) 
     raise ??? 

は今、「loopForEachFileInDirectory」方法はそれにさらにいくつかのメソッドを持っているとしている - 私はきれいなコーディング(歓声ロバート・マーティン)のビットをやっていますここに。私が望むのは、サブメソッドからの例外を吹き飛ばし、メインループで何かが発生した場合、そのループを保留し続けます。

質問は、一般的な例外をバブリングするルールは何ですか?私はちょうどそれ自身で上げるか?もしそうなら、私はどのように一般的に例外をスローするのですか?一般的な例外の詳細をキャッチしてどのように記録するのですか?

答えて

5

汎用的な例外を泡立てるためのルールは何ですか?私はちょうどそれ自身で上げるか?

はい。簡単な答えはraiseを使用することです。

もしそうなら、どのように私は一般的に例外をスローしない...

上記の回答投稿他の提出者は正しいですが、それは文脈の方法で多くを提供していません。

Exceptionは基本クラス例外です。 except Exceptionはすべてのタイプの Exceptionで動作します。これは、すべてのPython例外がこのクラスから継承するためです。

exceptステートメントは、例外オブジェクトを指す引数を指定できます。

この文脈では、それを指定することが厳密に必要であるとは私は考えていません。例外の種類または特定の例外オブジェクトを参照する変数eを指定する任意の本当の必要性なし

except: 
    raise 

:実際には、それはおそらくデフォルトでバブルアップ例外をするのに十分です。

..一般的な例外の詳細をどのように捕捉してログに記録しますか?

logging.exceptionは良い方法です。それを試してみてください:

try: 
    <something that raises an error> 
except Exception, e: 
    logging.exception(e) 
+0

固体とクリア、ありがとう! – bharal

0
#!/usr/bin/python 

try: 
     print 'Youll see me first.' 

     try: 
       1[90] 

     except Exception,e: 

       print "************ UTOH!",str(e) 
       raise e 

except Exception,e: 

     print ">>>>>>>>>>>> I concur, THE JIG IS UP!",str(e) 
     raise e 
+1

'上げるe'の問題は、あなただけに関連付けられているスタックトレースを失ったということです元の例外。それだけで 'raise'を使用してください。 – sblom

3

他のポスターが書かれている短いPython 3の拡張です。ほとんどの場合、裸のraiseで十分です。ほとんどの場合、元の例外を再発生させます。

しかし、代わりに新しい例外を発生させたい場合があります。おそらく、オリジナルのものに情報を追加したり(処理対象の犯人オブジェクトのIDなど)、複数の例外タイプを1つにまとめて呼び出し側。

このような場合にraise ... from ...(パイソン3のみ、私は怖い)構築物が同様に有用である:

try: 
    self.file = open(filename) 
except IOError, exc: 
    raise DatabaseError('failed to open') from exc 

from句の利点は、それが元の例外のスタックトレースを保持することですこれはまったく新しい例外を発生させた場合に失われます。

のPython 2で例外の再梱包適切には、ここでのトピックをカバーイアンBickingにより、優れたブログ記事があります、難しいです:http://blog.ianbicking.org/2007/09/12/re-raising-exceptions/

+0

のpython 2.7(私は指定していないことを知っている!)を使用して、これは本当に私の質問に答えていない。申し訳ありません、それは私のせいです。しかし、もしdjangoがPython 3に移動したら、これは非常に役に立ちます。ありがとう! – bharal

+0

@ user1061426はい、私はそれがPython2かもしれないと思った、最後のリンクはこれに関するいくつかの有用な情報を持っています。 –

関連する問題