2016-10-23 5 views
2

私はしばしばPythonで "許可のために許してほしい"と読むので、ifの代わりにtry exceptを使う方が良いと考えられることがあります。Pythonの例外処理:唯一の特定のerrnoをキャッチする

私は、多くの場合、これが唯一のエラーであるとして、私は、より具体的かつ唯一errno.EEXISTを無視したいと思いますしかしおそらく交換が

try: 
    os.mkdir(dir) 
except OSError: 
    pass. 

だろう

if (not os.path.isdir(dir)): 
    os.mkdir(dir). 

のようなステートメントを持っています何が起こるかわからない。

try: 
    os.mkdir(dir) 
except OSError: 
    if(OSError.errno != errno.EEXIST): 
     raise 
    else: 
     pass. 

このトリックを行うようです。しかし、これは本当にかさばり、私のコードを「汚染」し、これらのコードブロックをたくさん必要とすると可読性が低下します。 Python 2.Xでこれを行うためのpythonの方法はありますか?そのようなケースを処理するための標準的な手順は何ですか?

編集:

  • 使用レイズ代わりに私が使用@Francisco Couzoによって指摘
  • としてOSERRORを上げるのPython 2.7
+1

ただ、 'あなたは、例外のコンテキストを失うことはありませんので、 –

+1

あなただけの' FileExistsError'を捕まえることができOSError'を上げていない、 'raise'の操作を行います。' FileExistsError除きます。http:のpass' – vaultah

+0

DUP // stackoverflowのを。 com/questions/20790580/python-specific-handle-file-exists-exception –

答えて

0

私は一度だけコンテキストマネージャを作成する醜い仕事を持っている。この方法は、その後から構文上はかなりいいです

import errno 
from contextlib import contextmanager 

@contextmanager 
def ignorednr(exception, *errornrs): 
    try: 
     yield 
    except exception as e: 
     if e.errno not in errornrs: 
      raise 
     pass 


with ignorednr(OSError, errno.EEXIST): 
    os.mkdir(dir) 

と読める。

溶液は、https://www.youtube.com/watch?v=OSGv2VnC0goから取得されます。

0

この例では、例外OSError : 17, 'File exists'

 import sys 
    try: 
     value = os.mkdir("dir") 
    except: 
     e = sys.exc_info()[:2] 
     e = str(e) 
     if "17" in e: 
      raise OSError #Perform Action 
     else: 
      pass 

のためであります例外番号で番号17を変更するだけです。どんな引数を渡す関数を呼び出すその後

def catch(d, err): 
    try: 
     os.mkdir(d) 
    except OSError as e: 
     if e.errno != err: 
      raise 

:あなたはそれを異なる引数で複数回呼び出している場合は、この[リンクhttps://docs.python.org/2/library/sys.html#sys.exc_info][1]

+2

私は私の質問がすでに良い答えを提供していると思っています。それはもっと短く、明示的な数字を使用しません。私はシステムによって数値が異なるかもしれないので、 'errno。EEXISTはより良く読みやすくなります。 – DerWeh

0

でより良い説明を得る機能でそれを置くことができます

catch(, "foo", errno.EEXIST) 

はまた、あなたが望んでいた場合は、複数のerrnoのを渡す渡すオプションを許可することができ、より:

def catch(d, *errs): 
    try: 
     os.mkdir(d) 
    except OSError as e: 
     if e.errno not in errs: 
      raise 

catch("foo", errno.EEXIST, errno.EPERM) 
コンテキストマネージャを作成:私はちょうど、おそらく最もエレガントなソリューションに出くわし10