捕获退出代码3

本文关键字:代码 退出 | 更新日期: 2023-09-27 18:06:09

我有一个简单的永无止境的winforms后台应用程序,它可以将网络摄像头拍摄的照片保存到硬盘上,处理一下,然后删除它们。图片保存和处理是两个独立的过程,第一个过程要快一些。为了不让磁盘上的图片过载,我设置了当前可以保存的图片数量限制。为此,我使用了Queue of strings。

问题是,有时应用程序崩溃与退出代码3 (ERROR_PATH_NOT_FOUND)。这似乎是不可能从我的代码中发生的,因为只有一条路径我正在使用,在任何时候都没有被调和。我还在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;
    }
}

和文件读取:

while (true) 
{
    try 
    {
        if (videoSource == null && snapshotsQueue.Count == 0) return;
        while (snapshotsQueue.Count == 0) Thread.Sleep(100);
        var snapshot = snapshotsQueue.Dequeue();
        // process image
        File.Delete(snapshot);    
    } 
    catch (Exception ex) 
    {
        writeError(ex.Message);
    }
}

捕获退出代码3

您可以捕获ThreadException和所有UnhandledException:

static void Main()
{
    Application.ThreadException += new ThreadExceptionEventHandler(HandleThreadException);
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(HandleUnhandledException);
    //... do your stuff
}
static void HandleThreadException(object sender, ThreadExceptionEventArgs e)
{
   //log the exception or something else
}
static void HandleUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
   //log the exception or something else
}

这应该捕获所有在其他地方没有捕获的异常!
UnhandledExceptionEventHandler捕获来自主UI线程的异常,而ThreadExceptionEventHandler在非UI线程中获得未捕获异常的通知。

要进一步阅读,请参阅UnhandledException EventThreadException Event的MSDN。您甚至可能需要设置UnhandledExceptionMode

我真的不推荐这个作为一个长期的答案-但是你可以做一个整体的应用程序捕获,甚至重新启动你的应用程序。

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.OnThreadException += MyHandler;
AppDomain.CurrentDomain.UnhandledException += otherHandler;

你可以把它放在应用程序的program.cs中

我建议你把它转换成一个服务,而不是一个持续运行的应用程序。我也忍不住觉得有一些错误陷阱,你可以在应用程序的某个地方做得更优雅。

在你的处理程序中,你当然可以如果它是半终结符

Application.Restart();

就像它的发音一样