from inspect import _empty as inspect_empty, signature, stack
 from queue import SimpleQueue, Empty as QueueEmpty
 from signal import SIGWINCH, signal
-from socket import socket
+from socket import socket, gaierror as socket_gaierror
 from threading import Thread
 from typing import (
     Any, Callable, Generator, Iterator, Literal, NamedTuple, Optional, Self)
                  ) -> None:
         self._idx = idx
         self._q_to_main = q_to_main
+        self._assumed_open = False
+        self._recv_loop: Optional[SocketRecvLoop] = None
         self._socket = socket()
         self._socket.settimeout(TIMEOUT_CONNECT)
-        self._socket.connect((hostname, PORT))
+        self._broadcast('CONNECTION_WINDOW', self._idx)
+        try:
+            self._socket.connect((hostname, PORT))
+        except socket_gaierror as e:
+            self._broadcast('CONN_ALERT', str(e))
+            return
         self._assumed_open = True
         self._socket.settimeout(TIMEOUT_LOOP)
         self._recv_loop = SocketRecvLoop(self._idx, self._q_to_main,
                                          self._read_lines())
-        self._broadcast('CONNECTION_WINDOW', self._idx)
         self._broadcast('SEND', IrcMessage('USER', [login[0], '0', '*',
                                                     login[2]]))
         self._broadcast('SEND', IrcMessage('NICK', [login[1]]))
     def close(self):
         'Close both SocketRecvLoop and socket.'
         self._assumed_open = False
-        self._recv_loop.stop()
+        if self._recv_loop:
+            self._recv_loop.stop()
         self._socket.close()
 
     def _broadcast(self, type_: str, payload: Any = None) -> None: