Skip to content

Commit

Permalink
Introduced catch, log and swallow approach for all exceptions in dele…
Browse files Browse the repository at this point in the history
…gates dispatched to the UI thread.
  • Loading branch information
MDoerner committed Nov 8, 2017
1 parent 096c085 commit 0faae3f
Show file tree
Hide file tree
Showing 8 changed files with 168 additions and 91 deletions.
36 changes: 23 additions & 13 deletions RetailCoder.VBE/Navigation/CodeExplorer/CodeExplorerViewModel.cs
Expand Up @@ -35,6 +35,8 @@ public sealed class CodeExplorerViewModel : ViewModelBase, IDisposable
private GeneralSettings _generalSettings;
private WindowSettings _windowSettings;

private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

public CodeExplorerViewModel(FolderHelper folderHelper, RubberduckParserState state, List<CommandBase> commands,
IConfigProvider<GeneralSettings> generalSettingsProvider, IConfigProvider<WindowSettings> windowSettingsProvider)
{
Expand Down Expand Up @@ -395,22 +397,30 @@ private void ParserState_ModuleStateChanged(object sender, Parsing.ParseProgress

UiDispatcher.Invoke(() =>
{
if (folderNode == null)
try
{
folderNode = new CodeExplorerCustomFolderViewModel(projectNode, projectName, projectName);
projectNode.AddChild(folderNode);
if (folderNode == null)
{
folderNode = new CodeExplorerCustomFolderViewModel(projectNode, projectName, projectName);
projectNode.AddChild(folderNode);
}
var declaration = CreateDeclaration(e.Module);
var newNode =
new CodeExplorerComponentViewModel(folderNode, declaration, new List<Declaration>())
{
IsErrorState = true
};
folderNode.AddChild(newNode);
// Force a refresh. OnPropertyChanged("Projects") didn't work.
Projects = Projects;
}
var declaration = CreateDeclaration(e.Module);
var newNode = new CodeExplorerComponentViewModel(folderNode, declaration, new List<Declaration>())
catch (Exception exception)
{
IsErrorState = true
};
folderNode.AddChild(newNode);
// Force a refresh. OnPropertyChanged("Projects") didn't work.
Projects = Projects;
Logger.Error(exception, "Exception thrown trying to refresh the code explorer view on the UI thread.");
}
});
}
}
Expand Down
45 changes: 27 additions & 18 deletions RetailCoder.VBE/UI/Command/FindAllImplementationsCommand.cs
Expand Up @@ -27,6 +27,8 @@ public class FindAllImplementationsCommand : CommandBase, IDisposable
private readonly SearchResultPresenterInstanceManager _presenterService;
private readonly IVBE _vbe;

private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

public FindAllImplementationsCommand(INavigateCommand navigateCommand, IMessageBox messageBox,
RubberduckParserState state, IVBE vbe, ISearchResultsWindowViewModel viewModel,
SearchResultPresenterInstanceManager presenterService)
Expand Down Expand Up @@ -63,29 +65,36 @@ private void _state_StateChanged(object sender, ParserStateEventArgs e)

private void UpdateTab()
{
var findImplementationsTabs = _viewModel.Tabs.Where(
t => t.Header.StartsWith(RubberduckUI.AllImplementations_Caption.Replace("'{0}'", ""))).ToList();

foreach (var tab in findImplementationsTabs)
try
{
var newTarget = FindNewDeclaration(tab.Target);
if (newTarget == null)
{
tab.CloseCommand.Execute(null);
return;
}
var findImplementationsTabs = _viewModel.Tabs.Where(
t => t.Header.StartsWith(RubberduckUI.AllImplementations_Caption.Replace("'{0}'", ""))).ToList();

var vm = CreateViewModel(newTarget);
if (vm.SearchResults.Any())
foreach (var tab in findImplementationsTabs)
{
tab.SearchResults = vm.SearchResults;
tab.Target = vm.Target;
}
else
{
tab.CloseCommand.Execute(null);
var newTarget = FindNewDeclaration(tab.Target);
if (newTarget == null)
{
tab.CloseCommand.Execute(null);
return;
}

var vm = CreateViewModel(newTarget);
if (vm.SearchResults.Any())
{
tab.SearchResults = vm.SearchResults;
tab.Target = vm.Target;
}
else
{
tab.CloseCommand.Execute(null);
}
}
}
catch (Exception exception)
{
Logger.Error(exception, "Exception thrown while trying to update the find implementations tab.");
}
}

protected override bool EvaluateCanExecute(object parameter)
Expand Down
43 changes: 25 additions & 18 deletions RetailCoder.VBE/UI/Command/FindAllReferencesCommand.cs
Expand Up @@ -61,29 +61,36 @@ private void _state_StateChanged(object sender, ParserStateEventArgs e)

private void UpdateTab()
{
var findReferenceTabs = _viewModel.Tabs.Where(
t => t.Header.StartsWith(RubberduckUI.AllReferences_Caption.Replace("'{0}'", ""))).ToList();

foreach (var tab in findReferenceTabs)
try
{
var newTarget = FindNewDeclaration(tab.Target);
if (newTarget == null)
{
tab.CloseCommand.Execute(null);
return;
}
var findReferenceTabs = _viewModel.Tabs.Where(
t => t.Header.StartsWith(RubberduckUI.AllReferences_Caption.Replace("'{0}'", ""))).ToList();

var vm = CreateViewModel(newTarget);
if (vm.SearchResults.Any())
foreach (var tab in findReferenceTabs)
{
tab.SearchResults = vm.SearchResults;
tab.Target = vm.Target;
}
else
{
tab.CloseCommand.Execute(null);
var newTarget = FindNewDeclaration(tab.Target);
if (newTarget == null)
{
tab.CloseCommand.Execute(null);
return;
}

var vm = CreateViewModel(newTarget);
if (vm.SearchResults.Any())
{
tab.SearchResults = vm.SearchResults;
tab.Target = vm.Target;
}
else
{
tab.CloseCommand.Execute(null);
}
}
}
catch (Exception exception)
{
Logger.Error(exception, "Exception thrown while trying to update the find all references tab.");
}
}

protected override bool EvaluateCanExecute(object parameter)
Expand Down
Expand Up @@ -107,11 +107,19 @@ private void SetStatusLabelCaption(string caption, int? errorCount = null)

UiDispatcher.Invoke(() =>
{
reparseCommandButton.SetCaption(caption);
reparseCommandButton.SetToolTip(string.Format(RubberduckUI.ReparseToolTipText, caption));
if (errorCount.HasValue && errorCount.Value > 0)
try
{
showErrorsCommandButton.SetToolTip(string.Format(RubberduckUI.ParserErrorToolTipText, errorCount.Value));
reparseCommandButton.SetCaption(caption);
reparseCommandButton.SetToolTip(string.Format(RubberduckUI.ReparseToolTipText, caption));
if (errorCount.HasValue && errorCount.Value > 0)
{
showErrorsCommandButton.SetToolTip(
string.Format(RubberduckUI.ParserErrorToolTipText, errorCount.Value));
}
}
catch (Exception exception)
{
Logger.Error(exception, "Exception thrown trying to set the status label caption on the UI thread.");
}
});
Localize();
Expand All @@ -125,9 +133,16 @@ private void SetContextSelectionCaption(string caption, int contextReferenceCoun

UiDispatcher.Invoke(() =>
{
contextLabel?.SetCaption(caption);
contextReferences?.SetCaption(contextReferenceCount);
contextDescription?.SetCaption(description);
try
{
contextLabel?.SetCaption(caption);
contextReferences?.SetCaption(contextReferenceCount);
contextDescription?.SetCaption(description);
}
catch (Exception exception)
{
Logger.Error(exception, "Exception thrown trying to set the context selection caption on the UI thread.");
}
});
Localize();
}
Expand Down
7 changes: 6 additions & 1 deletion RetailCoder.VBE/UI/Command/MenuItems/UiDispatcher.cs
@@ -1,6 +1,7 @@
using System;
using System.Threading;
using System.Windows.Threading;
using NLog;

namespace Rubberduck.UI.Command.MenuItems
{
Expand Down Expand Up @@ -61,7 +62,11 @@ private static void CheckInitialization()

public static void Shutdown()
{
Invoke(() => Dispatcher.CurrentDispatcher.InvokeShutdown());
Invoke(() =>
{
LogManager.GetCurrentClassLogger().Debug("Invoking shutdown on UI thread dispatcher.");
Dispatcher.CurrentDispatcher.InvokeShutdown();
});
}
}
}
35 changes: 21 additions & 14 deletions RetailCoder.VBE/UI/Command/ShowParserErrorsCommand.cs
Expand Up @@ -47,29 +47,36 @@ private void _state_StateChanged(object sender, ParserStateEventArgs e)

private void UpdateTab()
{
if (_viewModel == null)
try
{
return;
}
if (_viewModel == null)
{
return;
}

var vm = CreateViewModel();
var vm = CreateViewModel();

var tab = _viewModel.Tabs.FirstOrDefault(t => t.Header == RubberduckUI.Parser_ParserError);
if (tab != null)
{
if (_state.Status != ParserState.Error)
var tab = _viewModel.Tabs.FirstOrDefault(t => t.Header == RubberduckUI.Parser_ParserError);
if (tab != null)
{
tab.CloseCommand.Execute(null);
if (_state.Status != ParserState.Error)
{
tab.CloseCommand.Execute(null);
}
else
{
tab.SearchResults = vm.SearchResults;
}
}
else
else if (_state.Status == ParserState.Error)
{
tab.SearchResults = vm.SearchResults;
_viewModel.AddTab(vm);
_viewModel.SelectedTab = vm;
}
}
else if (_state.Status == ParserState.Error)
catch (Exception exception)
{
_viewModel.AddTab(vm);
_viewModel.SelectedTab = vm;
Logger.Error(exception, "Exception thrown while trying to update the parser errors tab.");
}
}

Expand Down
17 changes: 13 additions & 4 deletions RetailCoder.VBE/UI/Inspections/InspectionResultsViewModel.cs
Expand Up @@ -41,6 +41,8 @@ public sealed class InspectionResultsViewModel : ViewModelBase, INavigateSelecti
private readonly IGeneralConfigService _configService;
private readonly IOperatingSystem _operatingSystem;

private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

public InspectionResultsViewModel(RubberduckParserState state, IInspector inspector, IQuickFixProvider quickFixProvider,
INavigateCommand navigateCommand, ReparseCommand reparseCommand,
IClipboardWriter clipboard, IGeneralConfigService configService, IOperatingSystem operatingSystem)
Expand Down Expand Up @@ -305,10 +307,17 @@ private async void RefreshInspections()

UiDispatcher.Invoke(() =>
{
IsBusy = false;
OnPropertyChanged("EmptyUIRefreshVisibility");
IsRefreshing = false;
SelectedItem = null;
try
{
IsBusy = false;
OnPropertyChanged("EmptyUIRefreshVisibility");
IsRefreshing = false;
SelectedItem = null;
}
catch (Exception exception)
{
Logger.Error(exception, "Exception thrown trying to refresh the inspection results view on th UI thread.");
}
});

stopwatch.Stop();
Expand Down
47 changes: 31 additions & 16 deletions RetailCoder.VBE/UI/SourceControl/SourceControlViewViewModel.cs
Expand Up @@ -209,9 +209,16 @@ private void ResetView()

UiDispatcher.InvokeAsync(() =>
{
foreach (var tab in _tabItems)
try
{
foreach (var tab in _tabItems)
{
tab.ViewModel.ResetView();
}
}
catch (Exception exception)
{
tab.ViewModel.ResetView();
Logger.Error(exception, "Exception thrown while trying to reset the source control view on the UI thread.");
}
});
}
Expand Down Expand Up @@ -901,26 +908,34 @@ private void OpenRepoAssignedToProject()

private void Refresh()
{
_fileSystemWatcher.EnableRaisingEvents = false;
Logger.Trace("FileSystemWatcher.EnableRaisingEvents is disabled.");

if(Provider == null)
{
OpenRepoAssignedToProject();
}
else
try
{
foreach (var tab in TabItems)
_fileSystemWatcher.EnableRaisingEvents = false;
Logger.Trace("FileSystemWatcher.EnableRaisingEvents is disabled.");

if (Provider == null)
{
tab.ViewModel.RefreshView();
OpenRepoAssignedToProject();
}

if(Directory.Exists(Provider.CurrentRepository.LocalLocation))
else
{
_fileSystemWatcher.EnableRaisingEvents = true;
Logger.Trace("FileSystemWatcher.EnableRaisingEvents is enabled.");
foreach (var tab in TabItems)
{
tab.ViewModel.RefreshView();
}

if (Directory.Exists(Provider.CurrentRepository.LocalLocation))
{
_fileSystemWatcher.EnableRaisingEvents = true;
Logger.Trace("FileSystemWatcher.EnableRaisingEvents is enabled.");
}
}
}
catch (Exception exception)
{
//We catch and log everything since this generally gets dispatched to the UI thread.
Logger.Error(exception, "Exception while trying to refresh th source control view.");
}
}

private bool ValidRepoExists()
Expand Down

0 comments on commit 0faae3f

Please sign in to comment.