Memang benar bahwa satu-satunya cara yang tepat untuk menunjukkan kesalahan pada konstruktor adalah dengan meningkatkan pengecualian. Itulah sebabnya dalam C ++ dan dalam bahasa berorientasi objek lainnya yang telah dirancang dengan mempertimbangkan keselamatan pengecualian, destruktor tidak dipanggil jika pengecualian dilemparkan ke dalam konstruktor objek (artinya inisialisasi objek tidak lengkap). Ini sering tidak terjadi dalam bahasa scripting, seperti Python. Misalnya, kode berikut melempar AttributeError jika socket.connect () gagal:
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()
Alasannya adalah bahwa destruktor objek yang tidak lengkap dipanggil setelah upaya koneksi gagal, sebelum atribut stream diinisialisasi. Anda tidak boleh menghindari melemparkan pengecualian dari konstruktor, saya hanya mengatakan bahwa sulit untuk menulis sepenuhnya kode aman dengan Python. Beberapa pengembang Python menghindari penggunaan destruktor sama sekali, tapi itu masalah perdebatan lain.