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;