public void Append(Exception exception, string expectedRootError, string expectedText) { StringBuilder text = new(); string rootError = BugReportInvoker.Append(text, exception); rootError.Should().Be(expectedRootError); text.ToString().Should().Be(expectedText); }
private static void Main() { if (Environment.OSVersion.Version.Major >= 6) { SetProcessDPIAware(); } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // If an error happens before we had a chance to init the environment information // the call to GetInformation() from BugReporter.ShowNBug() will fail. // There's no perf hit calling Initialise() multiple times. UserEnvironmentInformation.Initialise(ThisAssembly.Git.Sha, ThisAssembly.Git.IsDirty); AppSettings.SetDocumentationBaseUrl(ThisAssembly.Git.Branch); #if SUPPORT_THEMES ThemeModule.Load(); Application.ApplicationExit += (s, e) => ThemeModule.Unload(); SystemEvents.UserPreferenceChanged += (s, e) => { // Whenever a user changes monitor scaling (e.g. 100%->125%) unload and // reload the theme, and repaint all forms if (e.Category == UserPreferenceCategory.Desktop || e.Category == UserPreferenceCategory.VisualStyle) { ThemeModule.ReloadWin32ThemeData(); foreach (Form form in Application.OpenForms) { form.BeginInvoke((MethodInvoker)(() => form.Invalidate())); } } }; #endif HighDpiMouseCursors.Enable(); try { DiagnosticsClient.Initialize(ThisAssembly.Git.IsDirty); // If you want to suppress the BugReportInvoker when debugging and exit quickly, uncomment the condition: ////if (!Debugger.IsAttached) { AppDomain.CurrentDomain.UnhandledException += (s, e) => BugReportInvoker.Report((Exception)e.ExceptionObject, e.IsTerminating); Application.ThreadException += (s, e) => BugReportInvoker.Report(e.Exception, isTerminating: false); } } catch (TypeInitializationException tie) { // is this exception caused by the configuration? if (tie.InnerException is not null && tie.InnerException.GetType() .IsSubclassOf(typeof(ConfigurationException))) { HandleConfigurationException((ConfigurationException)tie.InnerException); } } AppTitleGenerator.Initialise(ThisAssembly.Git.Sha, ThisAssembly.Git.Branch); // NOTE we perform the rest of the application's startup in another method to defer // the JIT processing more types than required to configure NBug. // In this way, there's more chance we can handle startup exceptions correctly. RunApplication(); }