microsoft/vscode-languageserver-node

Catching unhandled exceptions when starting language server by LanguageClient

開放

#1,307 建立於 2023年9月3日

 (1 則留言) (2 個反應) (0 位負責人)TypeScript (397 個分叉)auto 404
feature-requesthelp wanted

倉庫指標

星標
 (1,776 顆星)
PR 合併指標
 (PR 指標待抓取)

描述

When starting a language server (in my case python), which fails, there are a few exceptions that cannot be caught:

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)
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!

貢獻者指南