Skip to content

Commit 04b08cd

Browse files
committed
Add exception logging to RPS#OnStateChange and CodeMetricsAnalyst, fixes #4814
1 parent 5bb8d81 commit 04b08cd

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

Rubberduck.CodeAnalysis/CodeMetrics/CodeMetricsAnalyst.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@
55
using System.Collections.Generic;
66
using System.Linq;
77
using Rubberduck.Parsing.VBA.DeclarationCaching;
8+
using System;
9+
using NLog;
810

911
namespace Rubberduck.CodeAnalysis.CodeMetrics
1012
{
1113
public class CodeMetricsAnalyst : ICodeMetricsAnalyst
1214
{
15+
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
1316

1417
private readonly CodeMetric[] metrics;
1518

@@ -49,9 +52,16 @@ private IEnumerable<ICodeMetricResult> TraverseModuleTree(IParseTree parseTree,
4952
l.InjectContext((declarationFinder, moduleName));
5053
}
5154
var combinedMetricListener = new CombinedParseTreeListener(listeners);
52-
53-
ParseTreeWalker.Default.Walk(combinedMetricListener, parseTree);
54-
return listeners.SelectMany(l => l.Results());
55+
try
56+
{
57+
ParseTreeWalker.Default.Walk(combinedMetricListener, parseTree);
58+
return listeners.SelectMany(l => l.Results());
59+
}
60+
catch (Exception e)
61+
{
62+
Logger.Warn(e, "An exception occured during parse-tree traversal or result aggregation for Code Metrics");
63+
return Enumerable.Empty<ICodeMetricResult>();
64+
}
5565
}
5666
}
5767
}

Rubberduck.Parsing/VBA/RubberduckParserState.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,8 +396,21 @@ private void OnStateChanged(object requestor, CancellationToken token, ParserSta
396396
var handler = StateChanged;
397397
if (handler != null && !token.IsCancellationRequested)
398398
{
399-
var args = new ParserStateEventArgs(state, oldStatus, token);
400-
handler.Invoke(requestor, args);
399+
try
400+
{
401+
var args = new ParserStateEventArgs(state, oldStatus, token);
402+
handler.Invoke(requestor, args);
403+
}
404+
catch (Exception e)
405+
{
406+
if (e is OperationCanceledException cancellation)
407+
{
408+
throw cancellation;
409+
}
410+
// Error state, because this implies consumers are not exception-safe!
411+
// this behaviour could leave us in a state where some consumers have correctly updated and some have not
412+
Logger.Error(e, "An exception occurred when notifying consumers of updated parser state.");
413+
}
401414
}
402415
}
403416

0 commit comments

Comments
 (0)