运行时异常捕获在msv内部和外部之间是不同的

本文关键字:外部 之间 是不同 内部 msv 异常 运行时 | 更新日期: 2023-09-27 18:09:55

我在程序的某个地方调用了下面的函数,它将抛出一个异常

public static List<Templates> LoadTemplates()
{
    // ...
    // System.Threading.Thread.CurrentThread.ManagedThreadId == 1 // ID written to log file
    System.IO.Directory.GetFiles("does_not_exist_directory");
    // ...
}

我试着在默认的Program.cs

中捕捉异常
try
{
    // System.Threading.Thread.CurrentThread.ManagedThreadId == 1
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}
catch (Exception ex)
{
    MessageBox.Show("ERROR CAUGHT");
}
finally { // do clean up }

在MSVS中运行时,异常按预期捕获。但是,当双击输出目录中的.exe运行时,异常显示在消息对话框中,说明

编辑:

要在从输出目录运行.exe时捕获错误,必须将代码编译为处理应用程序。ThreadException事件

Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.Run(new Form());

但是MSVS会显示MSVS自带的"故障排除提示"无边界消息对话框"未处理的异常"。

我如何确保它在msv内外的行为相同?

运行时异常捕获在msv内部和外部之间是不同的

您所展示的代码将只捕获同一线程中的异常。如果没有看到违规代码和上下文,真的很难判断。

您可以订阅几个事件来捕获所有这些:

  • 应用程序域中。UnhandledException
  • 应用程序。ThreadException

请阅读/注意文档(第一个应该这样做)-有一些警告

看起来你的LoadTemplates调用是在自己的线程中进行的。我假设您没有在调试模式下看到MessageBox。您将看到Visual Studio异常窗口。

要解决这个问题,尝试使用AppDomain.CurrentDomain.UnhandledException事件:

[STAThread]
static void Main() {
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
    MessageBox.Show("Unhandled exception");
}

关于MSVS内外的异常行为,Carsten指出MSDN中的代码是正确的,但她没有帮助我更好地了解情况。

(可能不是这样,但是)似乎MSVS在从MSVS内部运行时将其内部事件处理程序挂钩到应用程序,并且该处理程序在应用程序中的处理程序之前运行。因此,当发生未处理的异常时,msv将显示其原生的"故障排除提示"对话框,并指向错误行。

此时,如果我单击continue (F5)继续执行代码,MSVS将重新抛出异常,这次它将被我自己的处理程序捕获。

在MSVS之外,没有其他处理程序被订阅,所以它只是直接运行我的处理程序。