C# 出口代码3

C# 出口代码3,c#,winforms,C#,Winforms,我有一个简单的永无止境的winforms后台应用程序,它将网络摄像头中的图片保存在硬盘上,对它们进行一些处理,然后删除它们。图片保存和处理是两个独立的过程,第一个过程稍微快一点。为了不让磁盘上的图片过载,我对目前可以保存的图片数量设置了一个限制。为此,我使用字符串队列 问题是,有时应用程序崩溃,退出代码为3,错误路径未找到。从我的代码来看,这似乎是不可能发生的,因为我只使用了一条路径,而且在任何情况下它都不会受到影响。我也在try-catch块中设置了所有可能的内容,但没有捕获任何内容。我认为它

我有一个简单的永无止境的winforms后台应用程序,它将网络摄像头中的图片保存在硬盘上,对它们进行一些处理,然后删除它们。图片保存和处理是两个独立的过程,第一个过程稍微快一点。为了不让磁盘上的图片过载,我对目前可以保存的图片数量设置了一个限制。为此,我使用字符串队列

问题是,有时应用程序崩溃,退出代码为3,错误路径未找到。从我的代码来看,这似乎是不可能发生的,因为我只使用了一条路径,而且在任何情况下它都不会受到影响。我也在try-catch块中设置了所有可能的内容,但没有捕获任何内容。我认为它可能来自我使用的两个更大的库中的一个。有没有办法知道这件讨厌的事情发生在哪里

好的,下面是保存图像的代码:

void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs) 
{
    videoSource.NewFrame -= videoSource_NewFrame;
    if (snapshotsQueue.Count < 100) 
    {
        Image myImage = (Image)eventArgs.Frame.Clone();
        string strGrabFileName;
        if (firstFrame) 
        {
            firstFrame = false;
            // extension is png
            strGrabFileName = String.Format(
                "{0}\\{1}.{2}", snapshotsPath, "0.0", 
                snapshotExtension.ToString().ToLowerInvariant()); 
            snapshotTimer.Start();
        }
        else 
        {
            strGrabFileName = String.Format(
                "{0}\\{1}.{2}", snapshotsPath,
                snapshotTimer.Elapsed.TotalSeconds.ToString(CultureInfo.InvariantCulture), snapshotExtension.ToString().ToLowerInvariant());
        }

        try 
        {
            myImage.Save(strGrabFileName, snapshotExtension);
            snapshotsQueue.Enqueue(strGrabFileName);
        } 
        catch (Exception e) 
        {
            writeError(e.Message);
            writeToLog(e.Message);
        }
    }

    Thread.Sleep(100);
    if (videoSource != null) 
    {
        videoSource.NewFrame += videoSource_NewFrame;
    }
}
您可以捕获线程异常和所有未处理的异常:

这将捕获其他地方未捕获的所有异常! UnhandledExceptionEventHandler从主UI线程捕获异常,而ThreadExceptionEventHandler在非UI线程中收到未捕获异常的通知


欲了解更多信息,请参阅和上的MSDN。你甚至可能需要设置这个参数

我真的不建议把这作为一个长期的答案,但你可以做一个全面的应用程序捕获,甚至重新启动你的应用程序

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.OnThreadException += MyHandler;
AppDomain.CurrentDomain.UnhandledException += otherHandler;
您可以将其放入应用程序的program.cs中

我建议您考虑将其转换为服务,而不是持续运行的应用程序。。我也情不自禁地感觉到,在应用程序的某个地方,存在一些错误陷阱,你可以做得更优雅一些

在您的处理程序中,您当然可以使用该半终端

Application.Restart();

这与听起来完全一样。

在继续编写代码之前,您可以添加检查以查看or是否存在。也许这会引起一些问题?要解决这个问题,你应该提供一些代码来显示你的支付能力和例外情况。@MarleenSchilt已经这样做了。作为记录,从我的观点来看,问题不应该发生在丢失的文件上,因为这将是一个不同的错误,因为退出代码3是专门针对directorywow的,比如下一票。我不在乎,但有什么问题吗?好吧,您可以只提供引发异常的相关代码,而不是整个应用程序-至少我想是的。我会试试这个,谢谢。希望,我不必永远等待它的发生。不幸的是,这也没有抓住任何东西。。。为了确保这一点,我将它放在程序主方法和表单主方法中。应用程序仍然只是偶尔停止工作,根本不会抛出任何异常。。。
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.OnThreadException += MyHandler;
AppDomain.CurrentDomain.UnhandledException += otherHandler;
Application.Restart();