Solusi Error socket.gaierror di Python: Penyebab & Perbaikan

Memahami socket.gaierror

socket.gaierror adalah pengecualian (exception) dalam Python yang terjadi ketika fungsi getaddrinfo() gagal melakukan resolusi nama domain (DNS lookup). Singkatnya, sistem tidak dapat menerjemahkan alamat host (seperti 'google.com') menjadi alamat IP yang dapat dipahami oleh protokol jaringan. Kesalahan ini biasanya ditandai dengan pesan [Errno -2] Name or service not known atau [Errno -5] No address associated with hostname.

Penyebab Utama

Masalah ini umumnya dipicu oleh tiga faktor teknis utama:

  • Koneksi Internet Terputus: Komputer tidak memiliki akses ke server DNS.
  • Kesalahan Penulisan Hostname: Typo pada URL atau domain yang tidak terdaftar (non-existent).
  • Konfigurasi DNS Lokal: File /etc/resolv.conf (Linux/macOS) atau pengaturan DNS Windows yang salah.
Pesan ErrorPenyebab Teknis
[Errno -2]Hostname tidak ditemukan di server DNS.
[Errno -5]Hostname valid, namun tidak memiliki record IP (A/AAAA).
[Errno -3]Temporary failure in name resolution (DNS timeout).

Langkah Perbaikan Teknis

Untuk menangani error ini secara elegan dalam kode Python, gunakan blok try-except agar program tidak berhenti mendadak (crash). Berikut adalah implementasi standar industri:

import socket

def check_connection(host, port=80):
    try:
        socket.getaddrinfo(host, port)
        return True
    except socket.gaierror:
        print(f"Error: Tidak dapat menemukan host {host}")
        return False
    except Exception as e:
        print(f"Error tak terduga: {e}")
        return False

# Penggunaan
if check_connection("www.google.com"):
    print("Koneksi stabil.")
else:
    print("Periksa DNS atau koneksi internet Anda.")

Tips Troubleshooting Lapangan

  1. Uji dengan Ping: Jalankan perintah ping google.com di terminal/CMD. Jika gagal, masalah ada pada koneksi internet atau DNS lokal, bukan pada kode Python Anda.
  2. Cek DNS Server: Jika Anda berada di jaringan korporat, pastikan firewall tidak memblokir akses DNS (port 53).
  3. Gunakan IP Statis: Jika domain sering gagal diresolusi, pertimbangkan menggunakan alamat IP langsung (jika IP tersebut bersifat statis).
  4. Timeout: Jika error terjadi karena koneksi lambat, tambahkan socket.setdefaulttimeout(10) di awal skrip Anda.