Catching unhandled exceptions when starting language server by LanguageClient #1307
Description
When starting a language server (in my case python), which fails, there are a few exceptions that cannot be caught:
Error: Pending response rejected since connection got disposed
at Object.dispose (...\dist\extension.js:8861:27)
at Object.dispose (...\dist\extension.js:5418:35)
at LanguageClient.handleConnectionClosed (...\dist\extension.js:5009:34)
at LanguageClient.handleConnectionClosed (...\dist\extension.js:3447:22)
at closeHandler (...\dist\extension.js:4996:18)
at CallbackList.invoke (...\dist\extension.js:6843:39)
at Emitter.fire (...\dist\extension.js:6905:36)
at closeHandler (...\dist\extension.js:8008:26)
at CallbackList.invoke (...\dist\extension.js:6843:39)
at Emitter.fire (...\dist\extension.js:6905:36)
at StreamMessageWriter.fireClose (...\dist\extension.js:7455:27)
at Socket.<anonymous> (...\dist\extension.js:7487:42)
at Socket.emit (node:events:513:28)
at Pipe.<anonymous> (node:net:757:14)
Error: Client is not running and can't be stopped. It's current state is: starting
at LanguageClient.shutdown (...\dist\extension.js:4818:19)
at LanguageClient.stop (...\dist\extension.js:4789:21)
at LanguageClient.stop (...\dist\extension.js:3417:22)
at LanguageClient.doInitialize (...\dist\extension.js:4771:27)
at async LanguageClient.start (...\dist\extension.js:4626:13)
at async restartServer (...\dist\extension.js:440:9)
at async ...\dist\extension.js:50:20
The problem is that VSCode for all unhandled errors creates an "unhandledError" telemetry event. For correct analysis of telemetry data, you must manually create an event that indicates a specific problem. In this case, for example, "serverStartFailed".
Yes, I can set initializationFailedHandler
in the LanguageClientOptions
and create the necessary telemetry event in it. But VSCode will still create a duplicate "unhandledError" event, because the error is not caught.
Another bewilderment is that the server's stderr output can only be received in the outputChannel
. Why not pass it as an argument to initializationFailedHandler
? Or create a corresponding attribute in the LanguageClient
class? To understand what happened to the user, I need to send all the information from the outputChannel
to the telemetry server, including unnecessary information.
It also looks strange to automatically try to stop a server that is not running, which leads to another error. And it also automatically sent to telemetry...
Thanks!