捕获退出代码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);
}
}
您可以捕获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 Event
和ThreadException Event
的MSDN。您甚至可能需要设置UnhandledExceptionMode
。
我真的不推荐这个作为一个长期的答案-但是你可以做一个整体的应用程序捕获,甚至重新启动你的应用程序。
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.OnThreadException += MyHandler;
AppDomain.CurrentDomain.UnhandledException += otherHandler;
你可以把它放在应用程序的program.cs中
我建议你把它转换成一个服务,而不是一个持续运行的应用程序。我也忍不住觉得有一些错误陷阱,你可以在应用程序的某个地方做得更优雅。
在你的处理程序中,你当然可以如果它是半终结符
Application.Restart();
就像它的发音一样