gpt4 book ai didi

.net - 如何:生成UnhandledException?

转载 作者:行者123 更新时间:2023-11-28 19:56:22 24 4
gpt4 key购买 nike

我使用此代码来捕获WinForm应用程序UnhandledException。

[STAThread]
static void Main(string[] args)
{
// Add the event handler for handling UI thread exceptions to the event.
Application.ThreadException += new
System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

// Set the unhandled exception mode to force all Windows Forms errors
// to go through our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

// Add the event handler for handling non-UI thread exceptions to the event.
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

try
{
Application.Run(new MainForm());
} catch....


在那里,我将尝试重新启动应用程序。现在我的问题是模拟这样的异常。在尝试之前(主要),我尝试过: throw new NullReferenceException("test"); VS抓住了它。

也尝试在MainForm代码中使用button:

    private void button1_Click(object sender, EventArgs ev)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(TestMe), null);
}

protected void TestMe(object state)
{
string s = state.ToString();
}


没有帮助,VS抓住了它,即使在发布模式下。


最后,我应如何强制应用程序生成 UnhandleldException
我可以在 CurrentDomain_UnhandledException中重新启动应用程序吗?
如何生成 ThreadException


PS。

如果我在VS之外启动Windows通用窗口


  遇到“应用程序MyApplication”
  一个错误,应该是
  已关闭... blabla ...发送报告/不
  发送。


但是我想要VS输入此方法(... Domain_Unhahdled ...)

编辑:
重新启动应用程序时,是否可以禁用出现以下窗口崩溃消息:
alt text http://byfiles.storage.msn.com/y1pOhWnAAXfMYtJH2VNa5iL0l1hjAqNHD2VmVnl8nN6L1oQC_xHkyHCJxhMc1ZLxLOH9ZXfZoo5zX8?PARTNER=WRITER


码:

static void CurrentDomain_UnhandledException(object sender, 
UnhandledExceptionEventArgs e)
{
// Since we can't prevent the app from terminating
// log this to the event log.
Logger.LogMessage(ERROR, errorMsg);
Application.Restart();

最佳答案

我仍然不能完全确定我是否理解这个问题,但有几点要提:


Application.ThreadExceptionApplication.SetUnhandledExceptionMode仅适用于Windows Forms线程。即使在Winforms应用程序中,任意ThreadPool线程实际上也不是Windows Forms线程,因此这两行代码无效。
AppDomain.CurrentDomain.UnhandledException注册事件将捕获在ThreadPool线程上发生的异常。
但是,UnhandledException事件实际上不能处理异常。到那时,终止进程终止已经为时已晚,如果在后台线程上发生异常,这将总是会发生(除非您启用了旧版.NET 1.1行为,但是...没有启用。)真的只对日志记录或清理有用。


我已经使用与您类似的测试代码对自己进行了测试,并验证了“ handler”异常中的代码确实可以执行。但是该应用仍然会崩溃,并且您无法停止它。

更新:我将再做一次尝试,仅此而已。

如果您的目标是始终运行无人值守的应用程序,那么您可以选择三种选择:


正确处理您的异常。到目前为止,这是最好的,也许是唯一正确的解决方案。挂钩AppDomain.UnhandledException不处理异常。当控件进入该事件处理程序时,您的应用程序已经崩溃。您无法保存它了。

从后台线程逃逸的未处理异常是代码中需要修复的灾难性错误。从后台线程逃逸的未处理异常是代码中需要修复的灾难性错误。从后台线程逃逸的未处理异常是代码中需要修复的灾难性错误。请不要再评论“我不在乎”的效果-您需要开始关心。
礼貌地要求Windows重新启动您的应用程序。与尝试从崩溃处理程序中重新启动(这是一个非常糟糕的主意)不同,它有很多原因无法完全枚举(数据损坏,无限的重新启动循环,资源泄漏,操作系统不稳定等),而registering for a restart实际上允许这种情况在半控制的时尚。正如我在评论中提到的那样,.NET中的interop with this API很简单。您应在应用程序启动后立即进行注册,而不是在应用程序崩溃且应用程序处于不受信任状态时进行注册。
创建一个监督程序,监视您的应用程序,并在崩溃时重新启动它。由于前两点中讨论的许多原因,这仍然很糟糕,但是您至少在某种程度上具有一定的战斗机会。

通过使用命名的互斥锁,在主管中等待它,并观察WAIT_ABANDONED状态(.NET中的AbandonedMutexException),可以非常可靠地指示应用程序崩溃。仅当拥有互斥量的进程终止而不释放它时(即具有未处理的异常),才会发生放弃状态。借助更多互操作性黑客攻击,您还可以检测并关闭崩溃窗口。


这些是您的选择。我强烈建议您处理后台线程上的异常,因为从后台线程逸出的未处理的异常是代码中需要修复的灾难性错误。如果它来自外部组件,并且您无法捕获它,那么灾难性的错误就在该组件中,您应该考虑将其报告给作者或使用其他组件。

如果该应用程序的稳定性不足以使其实际运行,那么仅仅具有“该应用程序必须始终运行并且应该完全忽略致命崩溃”的要求并不能使这种情况成为可能。崩溃就是崩溃。您不会将汽车设计为在引擎突然死机后立即立即重新启动。您能做的最好的事情就是请受信任的操作员(它是人工操作员,操作系统还是某些监控软件)代表它重新启动应用程序。

这个问题的变化似乎经常出现-基本上,“我的应用程序永远都不应崩溃,否则,它应该是不可见的。我想吃掉所有未处理的异常,并假装它没有发生。”这不仅是不可能的,而且实际上与良好设计的每个原则(特别是“快速失败”原则背道而驰,可以肯定地重新解释但永远不应完全忽略它)。

这就是我能说的。如果您不愿意接受其中任何一种,那么祝您好运找到可行的替代方案。

关于.net - 如何:生成UnhandledException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2861459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com