Skip to content

Commit 57dd72f

Browse files
committed
Prevent crash when App.UnhandledException is somehow null
1 parent 2a27f35 commit 57dd72f

File tree

1 file changed

+67
-49
lines changed

1 file changed

+67
-49
lines changed

src/UniGetUI/App.xaml.cs

Lines changed: 67 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -126,68 +126,86 @@ private static async Task LoadGSudo()
126126

127127
private void RegisterErrorHandling()
128128
{
129-
UnhandledException += (_, e) =>
130-
{
131-
if (Debugger.IsAttached) Debugger.Break();
132-
string message = $"Unhandled Exception raised: {e.Message}";
133-
string stackTrace = $"Stack Trace: \n{e.Exception.StackTrace}";
134-
Logger.Error(" -");
135-
Logger.Error(" -");
136-
Logger.Error(" ⚠️⚠️⚠️ START OF UNHANDLED ERROR TRACE ⚠️⚠️⚠️");
137-
Logger.Error(message);
138-
Logger.Error(stackTrace);
139-
Logger.Error(" ⚠️⚠️⚠️ END OF UNHANDLED ERROR TRACE ⚠️⚠️⚠️");
140-
Logger.Error(" -");
141-
Logger.Error(" -");
142-
if (Environment.GetCommandLineArgs().Contains("--report-all-errors") || RaiseExceptionAsFatal || MainWindow is null)
143-
{
144-
CrashHandler.ReportFatalException(e.Exception);
145-
}
146-
else
147-
{
148-
MainWindow.ErrorBanner.Title = CoreTools.Translate("Something went wrong");
149-
MainWindow.ErrorBanner.Message = CoreTools.Translate("An interal error occurred. Please view the log for further details.");
150-
MainWindow.ErrorBanner.IsOpen = true;
151-
Button button = new() { Content = CoreTools.Translate("WingetUI Log"), };
152-
button.Click += (sender, args) => MainWindow.NavigationPage.UniGetUILogs_Click(sender, args);
153-
MainWindow.ErrorBanner.ActionButton = button;
154-
e.Handled = true;
155-
}
156-
};
157-
158-
TaskScheduler.UnobservedTaskException += (sender, args) =>
129+
try
159130
{
160-
Logger.Error($"An unhandled exception occurred in a Task (sender: {sender?.GetType().ToString() ?? "null"})");
161-
Exception? e = args.Exception.InnerException;
162-
Logger.Error(args.Exception);
163-
while (e is not null)
131+
UnhandledException += (_, e) =>
164132
{
165-
Logger.Error("------------------------------");
166-
Logger.Error(e);
167-
e = e.InnerException;
168-
}
169-
if (Debugger.IsAttached) Debugger.Break();
170-
171-
Dispatcher.TryEnqueue(() =>
172-
{
173-
try
133+
if (Debugger.IsAttached) Debugger.Break();
134+
string message = $"Unhandled Exception raised: {e.Message}";
135+
string stackTrace = $"Stack Trace: \n{e.Exception.StackTrace}";
136+
Logger.Error(" -");
137+
Logger.Error(" -");
138+
Logger.Error(" ⚠️⚠️⚠️ START OF UNHANDLED ERROR TRACE ⚠️⚠️⚠️");
139+
Logger.Error(message);
140+
Logger.Error(stackTrace);
141+
Logger.Error(" ⚠️⚠️⚠️ END OF UNHANDLED ERROR TRACE ⚠️⚠️⚠️");
142+
Logger.Error(" -");
143+
Logger.Error(" -");
144+
if (Environment.GetCommandLineArgs().Contains("--report-all-errors") || RaiseExceptionAsFatal || MainWindow is null)
145+
{
146+
CrashHandler.ReportFatalException(e.Exception);
147+
}
148+
else
174149
{
175150
MainWindow.ErrorBanner.Title = CoreTools.Translate("Something went wrong");
176151
MainWindow.ErrorBanner.Message =
177152
CoreTools.Translate("An interal error occurred. Please view the log for further details.");
178153
MainWindow.ErrorBanner.IsOpen = true;
179154
Button button = new() { Content = CoreTools.Translate("WingetUI Log"), };
180-
button.Click += (s, a) => MainWindow.NavigationPage.UniGetUILogs_Click(s, a);
155+
button.Click += (sender, args) => MainWindow.NavigationPage.UniGetUILogs_Click(sender, args);
181156
MainWindow.ErrorBanner.ActionButton = button;
157+
e.Handled = true;
182158
}
183-
catch (Exception ex)
159+
};
160+
}
161+
catch (Exception ex)
162+
{
163+
if(Debugger.IsAttached) Debugger.Break();
164+
Logger.Error(ex);
165+
}
166+
167+
try
168+
{
169+
TaskScheduler.UnobservedTaskException += (sender, args) =>
170+
{
171+
Logger.Error($"An unhandled exception occurred in a Task (sender: {sender?.GetType().ToString() ?? "null"})");
172+
Exception? e = args.Exception.InnerException;
173+
Logger.Error(args.Exception);
174+
while (e is not null)
184175
{
185-
Logger.Error(ex);
176+
Logger.Error("------------------------------");
177+
Logger.Error(e);
178+
e = e.InnerException;
186179
}
187-
});
188180

189-
args.SetObserved();
190-
};
181+
if (Debugger.IsAttached) Debugger.Break();
182+
183+
Dispatcher.TryEnqueue(() =>
184+
{
185+
try
186+
{
187+
MainWindow.ErrorBanner.Title = CoreTools.Translate("Something went wrong");
188+
MainWindow.ErrorBanner.Message = CoreTools.Translate(
189+
"An interal error occurred. Please view the log for further details.");
190+
MainWindow.ErrorBanner.IsOpen = true;
191+
Button button = new() { Content = CoreTools.Translate("WingetUI Log"), };
192+
button.Click += (s, a) => MainWindow.NavigationPage.UniGetUILogs_Click(s, a);
193+
MainWindow.ErrorBanner.ActionButton = button;
194+
}
195+
catch (Exception ex)
196+
{
197+
Logger.Error(ex);
198+
}
199+
});
200+
201+
args.SetObserved();
202+
};
203+
}
204+
catch (Exception ex)
205+
{
206+
if (Debugger.IsAttached) Debugger.Break();
207+
Logger.Error(ex);
208+
}
191209
}
192210

193211
private static void SetUpWebViewUserDataFolder()

0 commit comments

Comments
 (0)