3

我有一个项目可能会在任何函数和对象上抛出异常,有没有办法在整个框架/程序中捕获任何和所有异常,以便我可以记录它们以便以后可以看到它们?我想要调用堆栈和异常消息。我不一定知道异常将在哪里抛出,但我想记录在程序整个生命周期中任何地方发生的任何异常。有没有办法做到这一点?我不想尝试捕捉任何可能的异常抛出函数。程序会因为未处理的异常而中断,但我想先记录它。

4

6 回答 6

3

是的,有办法做到这一点。在 main 中写下以下几行:

// Add the event handler for handling UI thread exceptions to the event.
Application.ThreadException += new ThreadExceptionEventHandler(MainForm_UIThreadException);

// Set the unhandled exception mode to force all Windows Forms errors to go through
// our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

// Add the event handler for handling non-UI thread exceptions to the event. 
AppDomain.CurrentDomain.UnhandledException +=
    new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

而不是处理异常

private static void MainForm_UIThreadException(object sender, ThreadExceptionEventArgs t)
{
    //do something
}

private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    //do something
}
于 2013-03-05T23:17:09.953 回答
1

捕获异常的一个要点是根据抛出的异常类型正确处理它们。通过拥有一个大型异常处理程序,您将无法处理单个异常,而可能只是吞下它们。但这并不是说在所有情况下都不能或不应该这样做。

如果您的项目需要一个大型处理程序,那么您可以简单地处理AppDomain.UnhandledException事件。即使您在其他地方捕获异常,处理此方法也是一个好主意,以确保您的程序不会在您错过异常时抛出不友好的错误。这假设您正在创建一个WinForm.

由于您也在使用WCF,因此可以查看IErrorHandler接口以帮助处理错误消息。

于 2013-03-05T23:19:30.103 回答
1

有没有办法在整个框架/程序中捕获任何和所有异常,以便我可以记录它们以便以后可以看到它们?

捕获所有应用程序类型的所有未处理异常的唯一方法使用已经提到的AppDomain.CurrentDomain.UnhandledException. 但是,您不能阻止您的应用程序使用该事件终止(好吧,您可以,但我不会告诉您如何,因为它有点骇人听闻)。

然而,在大多数框架中都有一些方法可以捕获未处理的异常,这使您可以锁定异常并继续前进。既然您提到了 WCF,您可能想了解IErrorHandler

我不想尝试捕捉任何可能的异常抛出函数。

我就是这样做的。不要抓住那个异常。;)

于 2013-03-07T12:33:01.247 回答
0

您可以在应用程序域级别捕获异常 - App Domain Exception

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

如果您阅读链接,它提到一些其他事件可能会导致应用程序域不触发 - 例如 ThreadException - 因此可能需要多个处理程序。

Application.ThreadException += new ThreadExceptionEventHandler (ThreadExceptionHandler);

并注意以下几点:(关于 winforms - SetUnhandledExceptionMode

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
于 2013-03-05T23:17:36.113 回答
0

你总是可以使用AppDomain.UnhandledException

static void Main()
{
    AppDomain currentDomain = AppDomain.CurrentDomain;
    currentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_UnhandledException);
}

private static void AppDomain_UnhandledException(object sender, UnhandledExceptionEventArgs args) {
    Logger.Log((Exception)args.ExceptionObject);
}
于 2013-03-05T23:18:01.963 回答
0

有没有办法在整个框架/程序中捕获任何和所有异常,以便我可以记录它们以便以后可以看到它们?

的,有桌面应用程序或 Web 应用程序的处理程序来处理未处理的异常。在桌面应用程序中,该事件称为 UnhandledException。在 Web 应用程序中,它是应用程序入口点(通常是 Global.asax.cs)上的 Application_Error。

我不想尝试捕捉任何可能的异常抛出函数。程序会因为未处理的异常而中断,但我想先记录它。

如果您不想捕获异常,您总是可以简单地重新抛出。它将继续冒泡以使程序崩溃。

catch(Exception ex)
{
    //logging here
    throw;//rethrow
}

我想要调用堆栈和异常消息。

该类Exception包含这些。在事件处理程序的情况下,有多种访问方式取决于它是什么类型的应用程序。

于 2013-03-05T23:30:55.500 回答