diff --git a/src/sql/workbench/api/common/extHostNotebook.ts b/src/sql/workbench/api/common/extHostNotebook.ts index 5bd34380c9..58641942a2 100644 --- a/src/sql/workbench/api/common/extHostNotebook.ts +++ b/src/sql/workbench/api/common/extHostNotebook.ts @@ -108,7 +108,7 @@ export class ExtHostNotebook implements ExtHostNotebookShape { }; return details; } catch (error) { - throw typeof (error) === 'string' ? new Error(error) : error; + throw typeof (error) === 'string' ? new Error(error) : Object.assign(error, { errorCode: error.response?.status }); // Add errorCode so that status info persists over RPC } }); } diff --git a/src/sql/workbench/services/notebook/browser/models/clientSession.ts b/src/sql/workbench/services/notebook/browser/models/clientSession.ts index 6ddc9986af..ced8cfd585 100644 --- a/src/sql/workbench/services/notebook/browser/models/clientSession.ts +++ b/src/sql/workbench/services/notebook/browser/models/clientSession.ts @@ -50,6 +50,8 @@ export class ClientSession implements IClientSession { private _kernelConfigActions: ((kernelName: string) => Promise)[] = []; private _connectionId: string = ''; + private readonly _kernelNotFoundError = 501; + constructor(private options: IClientSessionOptions) { this._notebookUri = options.notebookUri; this._executeManager = options.executeManager; @@ -62,7 +64,6 @@ export class ClientSession implements IClientSession { public async initialize(): Promise { try { this._serverLoadFinished = this.startServer(this.options.kernelSpec); - await this._serverLoadFinished; await this.initializeSession(); await this.updateCachedKernelSpec(); } catch (err) { @@ -116,8 +117,8 @@ export class ClientSession implements IClientSession { session.defaultKernelLoaded = true; } catch (err) { // TODO move registration - if (err && err.response && err.response.status === 501) { - this.options.notificationService.warn(localize('kernelRequiresConnection', "Kernel {0} was not found. The default kernel will be used instead.", kernelSpec.name)); + if (err.response?.status === this._kernelNotFoundError || err.errorCode === this._kernelNotFoundError) { + this.options.notificationService.warn(localize('kernelRequiresConnection', "Kernel '{0}' was not found. The default kernel will be used instead.", kernelSpec.name)); session = await this._executeManager.sessionManager.startNew({ path: this.notebookUri.fsPath, kernelName: undefined diff --git a/src/vs/base/common/errors.ts b/src/vs/base/common/errors.ts index fee554bb1d..4639e688dd 100644 --- a/src/vs/base/common/errors.ts +++ b/src/vs/base/common/errors.ts @@ -104,12 +104,14 @@ export function transformErrorForSerialization(error: any): any; export function transformErrorForSerialization(error: any): any { if (error instanceof Error) { let { name, message } = error; + let errorCode = (error).errorCode; // {{SQL CARBON EDIT}} Add error code to retain more information const stack: string = (error).stacktrace || (error).stack; return { $isError: true, name, message, - stack + stack, + errorCode }; } diff --git a/src/vs/workbench/services/extensions/common/rpcProtocol.ts b/src/vs/workbench/services/extensions/common/rpcProtocol.ts index 5f97fcd13a..7273143a26 100644 --- a/src/vs/workbench/services/extensions/common/rpcProtocol.ts +++ b/src/vs/workbench/services/extensions/common/rpcProtocol.ts @@ -445,6 +445,7 @@ export class RPCProtocol extends Disposable implements IRPCProtocol { err.name = value.name; err.message = value.message; err.stack = value.stack; + err.errorCode = value.errorCode; // {{SQL CARBON EDIT}} Include custom error code } else { err = value; }