İçeride istisnalar ortaya çıkarmak kötü bir form olarak kabul edilir __init__
mi? Öyleyse, belirli sınıf değişkenleri olarak None
veya yanlış türde başlatıldığında hata atmanın kabul edilen yöntemi nedir?
İçeride istisnalar ortaya çıkarmak kötü bir form olarak kabul edilir __init__
mi? Öyleyse, belirli sınıf değişkenleri olarak None
veya yanlış türde başlatıldığında hata atmanın kabul edilen yöntemi nedir?
Yanıtlar:
İçeride istisnalar yaratmak __init__()
kesinlikle iyidir. Bir kurucu içinde bir hata durumunu belirtmenin başka iyi bir yolu yoktur ve standart kitaplıkta bir nesne oluşturmanın bir istisna oluşturabileceği yüzlerce örnek vardır.
Elbette yükseltilecek hata sınıfı size bağlıdır. ValueError
kurucuya geçersiz bir parametre geçirilmişse en iyisidir.
ValueError
ve TypeError
.
__init__
bunun kurucu olmadığını, onun başlatıcı olduğunu belirtmek isterim. Satırı düzenlemek isteyebilirsiniz Bir kurucuda bir hata durumunu belirtmenin başka iyi bir yolu yok, ..
Yapıcıdaki bir hatayı göstermenin tek uygun yolunun bir istisna oluşturmak olduğu doğrudur. Bu nedenle, C ++ 'da ve istisnai güvenlik göz önünde bulundurularak tasarlanmış diğer nesne yönelimli dillerde, bir nesnenin yapıcısında bir istisna atılırsa yıkıcı çağrılmaz (yani nesnenin başlatılması eksiktir). Python gibi komut dosyası dillerinde bu genellikle geçerli değildir. Örneğin, socket.connect () başarısız olursa aşağıdaki kod bir AttributeError atar:
class NetworkInterface:
def __init__(self, address)
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect(address)
self.stream = self.socket.makefile()
def __del__(self)
self.stream.close()
self.socket.close()
Bunun nedeni, tamamlanmamış nesnenin yıkıcısının, bağlantı girişimi başarısız olduktan sonra, akış özniteliği başlatılmadan önce çağrılmasıdır. Yapıcılardan istisnalar atmaktan kaçınmamalısınız, sadece Python'da tamamen istisna güvenli kod yazmanın zor olduğunu söylüyorum. Bazı Python geliştiricileri yıkıcıları kullanmaktan tamamen kaçınırlar, ancak bu başka bir tartışma konusudur.
__del__
kötü yazılmış olduğu için başarısız oluyor . this->p_socket->close()
C ++ 'da bir yıkıcıda yapsaydınız, tam olarak aynı sorunu yaşarsınız. C ++ 'da bunu yapmazsınız - üye nesnesinin kendini yok etmesine izin verirsiniz. Python'da da aynısını yapın.
Kötü biçimde olması için herhangi bir sebep görmüyorum.
Hata kodları dönen aksine tersine, istisnalar iyi yapıyor tanınırlar şeylerden birisi üzerine, hata kodları genellikle olmasıdır olamaz yapıcıları tarafından iade edilmesi. Bu nedenle, en azından C ++ gibi dillerde, istisnaları artırmak, hataları bildirmenin tek yoludur.
Yukarıdakilerin hepsine katılıyorum.
Bir nesnenin ilklendirilmesinde bir şeylerin ters gittiğini belirtmenin bir istisna yaratmaktan başka bir yolu yoktur.
Bir sınıfın durumunun tamamen o sınıfın girdilerine bağlı olduğu çoğu program sınıfında, bir tür ValueError veya TypeError'ın ortaya çıkmasını bekleyebiliriz.
Yan etkileri olan sınıflar (örneğin, ağ veya grafik yapan), (örneğin) ağ aygıtı kullanılamıyorsa veya tuval nesnesine yazılamıyorsa, init'te bir hata oluşturabilir. Bu bana mantıklı geliyor çünkü çoğu zaman başarısızlık koşullarını mümkün olan en kısa sürede bilmek istersiniz.