2015-03-30 15 views
11

Bir işlevin bir IOError veya OSError (ya da her ikisini birden mi?) Yükseltip yükseltmeyeceği konusunda her zaman kafam karışıyor. Bu istisna tiplerinin ardındaki temel kural nedir, aralarındaki fark ne zaman ortaya çıkar?IOError ve OSError arasındaki fark nedir?

İlk olarak OSError'un izin reddi gibi şeyler için olduğunu düşündüm, ancak izinsiz bir dosyayı açmak bir IOError'ı yükseltir.

+4

* Değişik 3.3 sürümünde: ' EnvironmentError', 'IOError',' WindowsError', VMSError', socket.error', select.error' ve 'mmap.error'' OSError'’a birleştirilmiştir. “OSError” a at ve “IOError” un unutma. –

+0

@MartijnPieters Teşekkürler, Python 2 etiketini ekledim. Sadece OSError'ı atmak bana iyi geliyor, ama ben her zaman shutil.copyfile() 'veya' os.access() 'gibi bir fonksiyonun IOError ya da OSError (her zaman yukarı bakmak zorunda kalması) anlamına geldiğinde ne zaman olduğunu bilmekte zorlanıyorum. –

+2

Ayrıca, bu konuyla ilgili olarak https://www.python.org/dev/peps/pep-3151/ adresine bakın, iki istisnayı da perspektif haline getirmeye yardımcı olur. –

cevap

21

İki tip arasında çok az fark vardır. Aslında, çekirdek Python geliştiricileri bile gerçek bir fark olmadığını kabul etti ve Python 3'te IOError'u kaldırdı (şimdi OSError için bir takma addır). PEP 3151 - Reworking the OS and IO exception hierarchy Bkz:

While some of these distinctions can be explained by implementation considerations, they are often not very logical at a higher level. The line separating OSError and IOError , for example, is often blurry. Consider the following:

>>> os.remove("fff") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OSError: [Errno 2] No such file or directory: 'fff' 
>>> open("fff") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 2] No such file or directory: 'fff' 

Evet, bu aynı hata mesajı iki farklı istisna türü bu.

Kendi kodunuz için OSError numaralı atışı yapıştırın. Mevcut işlevler için belgelerini kontrol (o detay yakalamak için gereken gereken), ancak güvenle binebilirsiniz:

try: 
    # ... 
except (IOError, OSError): 
    # handle error 

tekrar PEP alıntı:

In fact, it is hard to think of any situation where OSError should be caught but not IOError , or the reverse.

+0

veya: "EnvironmentError hariç:" (daha sonra PE2'de WindowsError, mmap.error, shutil.Error, vb. Temel sınıfı) – kxr

İlgili konular