diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Contracts/NodeInfo.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Contracts/NodeInfo.cs index 1fe09604..014a4d52 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Contracts/NodeInfo.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Contracts/NodeInfo.cs @@ -78,6 +78,31 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Contracts public NodeFilterProperty[] FilterableProperties { get; set; } } + /// + /// Creates a NodeInfo and configures it for error situations + /// + public static class ErrorNodeInfo + { + /// + /// Helper function to create an error node. + /// + /// The parent node the error node will appear under + /// The error message to display in the error node + /// NodeInfo instance with the specified parent path and error message + public static NodeInfo Create(string parentNodePath, string errorMessage) + { + return new NodeInfo() + { + ParentNodePath = parentNodePath, + ErrorMessage = errorMessage, + Label = errorMessage, + ObjectType = "error", + NodeType = "error", + IsLeaf = true + }; + } + } + /// /// The filterable properties that a node supports /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs index af77b8b1..a4cc1513 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs @@ -1,4 +1,4 @@ -// +// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. // @@ -453,7 +453,18 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer else { Logger.Verbose($"Expanding {nodePath}"); - nodes = node.Expand(cancelToken, securityToken?.Token, filters).Select(x => x.ToNodeInfo()).ToArray(); + try + { + nodes = node.Expand(cancelToken, securityToken?.Token, filters).Select(x => x.ToNodeInfo()).ToArray(); + } + catch (ConnectionFailureException ex) + { + var errorMessage = ex.InnerException?.Message ?? ex.Message; + + Logger.Error($"Failed to expand node: {errorMessage}"); + var errorNode = ErrorNodeInfo.Create(parentNodePath: nodePath, errorMessage: errorMessage); + nodes = new NodeInfo[] { errorNode }; + } } response.Nodes = nodes; response.ErrorMessage = node.ErrorMessage;