我有一个运行系统托盘应用程序的C#程序 - 在后台传输/移动/创建/编辑文件。
如果用户手册删除了程序正在使用的文件,有很多异常处理和循环处理可以防止程序崩溃/卡住。
不幸的是,程序运行的计算机之一是程序崩溃。计算机很难搞定,并且无法加载调试软件(它是一台没有网络访问权限的嵌入式PC)。
我已经尝试找到崩溃的原因(例如未处理的exeption)但是没有找到任何东西,并且无法访问PC,因为它位于远程位置。
我希望找到一种方法来使用AppDomain / UnhandledExceptionEventHandler来捕获所有未处理的异常并将其记录下来进行诊断。 但是,我(在故意)在类#34; DoSomething.class"中的办公室中创建的异常会使WinForm应用程序崩溃,而不是记录异常错误。
我的代码是:
//Current domain for the unhandled exception handling
AppDomain currentDomain;
[SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlAppDomain)]
public MainForm()
{
InitializeComponent();
currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionHandler);
CreateTimer.Interval = Settings.Default.CreateTimer;
CreateTimer.Start();
RunCopyProtocol();
ChangeFilesTimer.Interval = 10000;
ChangeFilesTimer.Start();
RunChangeFiles();
throw new Exception("ABC");
}
public void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs args)
{
try
{
Exception ex = (Exception)args.ExceptionObject;
SetLabel(ex);
}
finally { }
}
private string SetLabel(Exception ex)
{
String str;
str = ex.Message;
Label1.Text = str;
return str;
}
private void ChangeFilesTimer_Tick(object sender, EventArgs e)
{
RunChangeFiles();
throw new Exception("2");
}
为什么不抛出新的异常调用未处理的异常错误? 我如何使用AppDomain来获取未处理的异常处理程序来处理RunChangeFiles中的这个异常/异常?
AppDomain上的代码基于MSDN examples
答案 0 :(得分:3)
如果您的计时器是detex
,则MSDN here会记录原因:
Timer组件捕获并抑制事件处理程序为Elapsed事件抛出的所有异常。
看看这个类似的问题: How do I get the Exception that happens in Timer Elapsed event?
您必须捕获已废弃处理程序中抛出的异常,并在ThreadPool线程上重新抛出它们。
使用上面的代码并扩展引用问题的答案:
System.Timers.Timer
如果您的计时器是private void ChangeFilesTimer_Tick(object sender, EventArgs e)
{
try
{
RunChangeFiles();
}
catch (Exception ex)
{
ThreadPool.QueueUserWorkItem(
_ => { throw new Exception("Exception on timer thread.", ex); });
}
}
,那么您需要挂钩Application.ThreadException事件来处理未处理的异常。
在致电System.Windows.Forms.Timer
之前订阅此活动。
在重新抛出异常之前,您还可以在本地异常处理块中处理Application.Run()
的日志记录。
Exception