Add unhandled error handling and crash logging to chardonnay

This commit is contained in:
Mbucari 2023-07-07 14:14:12 -06:00
parent 9243aa47e7
commit 4df9e5abbf

View File

@ -1,7 +1,6 @@
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using ApplicationServices; using ApplicationServices;
using AppScaffolding; using AppScaffolding;
@ -35,6 +34,7 @@ namespace LibationAvalonia
$"\"{Configuration.ProcessDirectory}\""); $"\"{Configuration.ProcessDirectory}\"");
return; return;
} }
AppDomain.CurrentDomain.UnhandledException += (o, e) => LogError(e.ExceptionObject);
//***********************************************// //***********************************************//
// // // //
@ -42,23 +42,32 @@ namespace LibationAvalonia
// // // //
//***********************************************// //***********************************************//
// Migrations which must occur before configuration is loaded for the first time. Usually ones which alter the Configuration // Migrations which must occur before configuration is loaded for the first time. Usually ones which alter the Configuration
var config = LibationScaffolding.RunPreConfigMigrations(); try
//Start as much work in parallel as possible.
var classicLifetimeTask = Task.Run(() => new ClassicDesktopStyleApplicationLifetime());
var appBuilderTask = Task.Run(BuildAvaloniaApp);
if (config.LibationSettingsAreValid)
{ {
if (!RunDbMigrations(config)) var config = LibationScaffolding.RunPreConfigMigrations();
return;
App.LibraryTask = Task.Run(() => DbContexts.GetLibrary_Flat_NoTracking(includeParents: true)); //Start as much work in parallel as possible.
var classicLifetimeTask = Task.Run(() => new ClassicDesktopStyleApplicationLifetime());
var appBuilderTask = Task.Run(BuildAvaloniaApp);
if (config.LibationSettingsAreValid)
{
// most migrations go in here
LibationScaffolding.RunPostConfigMigrations(config);
LibationScaffolding.RunPostMigrationScaffolding(Variety.Chardonnay, config);
//Start loading the library before loading the main form
App.LibraryTask = Task.Run(() => DbContexts.GetLibrary_Flat_NoTracking(includeParents: true));
}
appBuilderTask.GetAwaiter().GetResult().SetupWithLifetime(classicLifetimeTask.GetAwaiter().GetResult());
classicLifetimeTask.Result.Start(null);
}
catch(Exception e)
{
LogError(e);
} }
appBuilderTask.GetAwaiter().GetResult().SetupWithLifetime(classicLifetimeTask.GetAwaiter().GetResult());
classicLifetimeTask.Result.Start(null);
} }
public static AppBuilder BuildAvaloniaApp() public static AppBuilder BuildAvaloniaApp()
@ -67,20 +76,35 @@ namespace LibationAvalonia
.LogToTrace() .LogToTrace()
.UseReactiveUI(); .UseReactiveUI();
public static bool RunDbMigrations(Configuration config) private static void LogError(object exceptionObject)
{ {
try var logError = $"""
{ {DateTime.Now} - Libation Crash
// most migrations go in here OS {Configuration.OS}
LibationScaffolding.RunPostConfigMigrations(config); Version {LibationScaffolding.BuildVersion}
LibationScaffolding.RunPostMigrationScaffolding(Variety.Chardonnay, config); ReleaseIdentifier {LibationScaffolding.ReleaseIdentifier}
InteropFunctionsType {InteropFactory.InteropFunctionsType}
LibationFiles {getConfigValue(c => c.LibationFiles)}
Books Folder {getConfigValue(c => c.Books)}
=== EXCEPTION ===
{exceptionObject}
""";
return true; var crashLog = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "LibationCrash.log");
}
catch (Exception exDebug) using var sw = new StreamWriter(crashLog, true);
sw.WriteLine(logError);
static string getConfigValue(Func<Configuration, string> selector)
{ {
Serilog.Log.Logger.Debug(exDebug, "Silent failure"); try
return false; {
return selector(Configuration.Instance);
}
catch (Exception ex)
{
return ex.ToString();
}
} }
} }
} }