microsoft / vscode-languageserver-node

Language server protocol implementation for VSCode. This allows implementing language services in JS/TS running on node.js
MIT License
1.46k stars 326 forks source link

Catching unhandled exceptions when starting language server by LanguageClient #1307

Open oliversen opened 1 year ago

oliversen commented 1 year ago

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 ```javascript 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. (...\dist\extension.js:7487:42) at Socket.emit (node:events:513:28) at Pipe. (node:net:757:14) ```
Error: Client is not running and can't be stopped. It's current state is: starting ```javascript 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!

dbaeumer commented 1 year ago

I am open for improvements here. PR welcome.