2015-06-24 43 views
0

[据我所知,有100个在网上类似问题的,但我还是没能找到一个工作解决了这个问题,因此张贴]退出任何未处理的异常的情况下,应用

我有ac#Win-Form应用程序。该应用程序用于从另一台服务器通过FTP下载图像。

在任务计划程序的帮助下,应用程序每天运行3次并下载图像,之后它会自动关闭。

然而,自去年年初以来,我们从应用程序中获取未处理的异常,如“请求超时”或“操作超时”。

因此,不是应用程序自动关闭,而是显示一个带有“继续”和“退出”按钮的窗口对话框。

我的要求是,应用程序应该自动关闭万一引发任何未处理的异常。

我在我的program.cs中编写了下面的代码来处理这个问题。但是,这也不起作用,我仍然收到异常窗口。

[STAThread] 
    static void Main() 
    { 
     AppDomain currentDomain = AppDomain.CurrentDomain; 
     currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
    static void MyHandler(object sender, UnhandledExceptionEventArgs args) 
    { 
     System.Diagnostics.Process proc = System.Diagnostics.Process.GetCurrentProcess(); 
     System.Windows.Forms.Application.Exit(); 
     System.Environment.Exit(0); 
     proc.Kill(); 
     return; 
    } 
+0

为什么要解析_UnhandledExceptionEventArgs_作为参数?为什么不使用try-catch块? –

+1

@AhsN因为他正在订阅'currentDomain.UnhandledException'。异常可能来自单独的线程。 –

回答

1

有,您可能需要订阅,以确保您抓住每一个可能的例外几个事件:

Application.ThreadException += yourThreadExceptionHandler; 
AppDomain.CurrentDomain.UnhandledException += yourUnhandledExceptionHandler; 
TaskScheduler.UnobservedTaskException += yourUnobservedTaskExceptionHandler; 

当然,你也应该有周围人的身体一个try/catch程序:

public static void Main() 
{ 
    try 
    { 
     runProgram(); 
    } 

    catch (Exception exception) 
    { 
     // Your main exception handler. 
    } 
} 

你可以有一个通用的异常处理机制,所有附加的处理程序调用,以避免重复的代码。 UnobservedTaskException可能是您想要处理不同的东西(记录它,否则可能会忽略)。

+0

我要提到你在这里提到的相同的东西,以及一个主要的东西:他如何确保应用程序终止 - 我假设OP不想要任何模型对话框 –

相关问题