src/goDebugFactory.ts: send terminated event on server start error

If there was an error starting or connecting to the server, we need
to send a terminated event and error to the client to ensure that
the client knows there is no debug process running.

Fixes golang/vscode-go#1413

Change-Id: I4aa5166fd126f5546bb43fb3ad563fc9f9ca93b7
Reviewed-on: https://go-review.googlesource.com/c/vscode-go/+/309809
Trust: Suzy Mueller <suzmue@golang.org>
Run-TryBot: Suzy Mueller <suzmue@golang.org>
TryBot-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
diff --git a/src/goDebugFactory.ts b/src/goDebugFactory.ts
index 74d009e..47c79be 100644
--- a/src/goDebugFactory.ts
+++ b/src/goDebugFactory.ts
@@ -173,8 +173,19 @@
 		if (!this.connected) {
 			this.connected = this.startAndConnectToServer();
 		}
-		await this.connected;
-		super.sendMessageToServer(message);
+		try {
+			await this.connected;
+			super.sendMessageToServer(message);
+		} catch (err) {
+			// If there was an error connecting, show an error message
+			// and send a terminated event, since we cannot start.
+			if (err) {
+				const errMsg = `connect to server error: ${err}`;
+				this.sendMessageToClient(new OutputEvent(errMsg));
+				vscode.window.showErrorMessage(errMsg);
+			}
+			this.sendMessageToClient(new TerminatedEvent());
+		}
 	}
 
 	async dispose() {
@@ -185,6 +196,9 @@
 		}
 		this.connected = undefined;
 		const dlvDapServer = this.dlvDapServer;
+		if (!dlvDapServer) {
+			return;
+		}
 		if (dlvDapServer.exitCode !== null) {
 			console.log(`dlv dap process(${dlvDapServer.pid}) exited ${dlvDapServer.exitCode}`);
 			return;