代码之家  ›  专栏  ›  技术社区  ›  serhio

如何:生成未处理的异常?

  •  3
  • serhio  · 技术社区  · 15 年前

    我使用此代码捕获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抓住了它。

    在主窗体代码中也尝试了按钮:

        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 是吗?

    附言。

    如果我发射 在vs之外 windows通用窗口

    遇到“应用程序myapplication” 一个错误,应该是 关闭…布拉布拉…发送报告/不发送 发送。

    不过,我想让vs输入这个方法(…域未加密…)

    编辑: 重新启动应用程序时,是否可以 禁用Windows崩溃消息 看起来像: 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();
    
    2 回复  |  直到 15 年前
        1
  •  6
  •   Aaronaught    15 年前

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

    • Application.ThreadException Application.SetUnhandledExceptionMode 仅适用于Windows窗体线程。武断的 ThreadPool 线程实际上不是windows窗体线程,即使在winforms应用程序中也是如此,因此这两行代码是无效的。

    • 向注册事件 AppDomain.CurrentDomain.UnhandledException 发生在上的陷阱异常 线程池 线。

    • 然而 ,和 UnhandledException 事件实际上不能 手柄 例外。到那时,停止进程终止已经太迟了,如果后台线程发生异常,则总是会发生这种情况(除非您启用了传统的.NET 1.1行为,但是…不要。)此事件只对日志记录或清理有用。

    我已经用类似于您的测试代码亲自测试了它,并验证了异常“handler”中的代码确实执行了。但应用程序仍然会崩溃,你无法阻止它。

    更新: 我要再做一次尝试,就这样。

    如果您的目标是让无人值守的应用程序始终运行,那么您正好有三个选项:

    1. 正确处理异常。 这是, 到目前为止 ,最好的 只有正确的 解决方案。挂钩 AppDomain.UnhandledException 处理异常。当控件进入该事件处理程序时,应用程序已 已经 坠毁。你再也救不了它了。

      从后台线程转义的未处理异常是代码中需要修复的灾难性错误。从后台线程转义的未处理异常是代码中需要修复的灾难性错误。从后台线程转义的未处理异常是代码中需要修复的灾难性错误。 拜托,不要再评论“我不在乎”了-你需要 开始 乐于助人的。

    2. 询问窗口 有礼貌地 为您重新启动应用程序。 与尝试从崩溃处理程序重新启动不同,这是一个非常糟糕的主意,原因太多,无法完全枚举(数据损坏、无限重新启动循环、资源泄漏、操作系统不稳定等)。 registering for a restart 实际上允许这种情况以半控制的方式发生。正如我在评论中提到的,很简单 interop with this API 在.net中。当应用程序启动时,而不是当它崩溃并且应用程序处于不受信任状态时,您可以立即注册。

    3. 创建监视应用程序并在应用程序崩溃时重新启动它的管理器服务。对于前两点所讨论的许多原因来说,这仍然是不好的,但是至少在某种程度上你有一个战斗的机会。

      通过使用命名互斥锁,在主管中等待,并监视 WAIT_ABANDONED 国家( AbandonedMutexException 在.net中)。只有当拥有互斥锁的进程在没有释放互斥锁的情况下终止时,才会出现放弃状态,即有未处理的异常。通过更多的互操作攻击,您还可以检测并关闭崩溃窗口。

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

    如果应用程序不够稳定,无法继续运行,那么仅仅要求“这个应用程序必须始终运行,并且应该完全忽略致命的崩溃”,并不能使这种情况成为可能。撞车就是撞车。如果发动机突然熄火,你不能设计一辆汽车立即重新启动。你能做的最好的事情就是让一个可信的操作员,不管是人工操作员、操作系统还是一些监控软件,代表它重新启动应用程序。

    这个问题的变体似乎经常出现——基本上,“我的应用程序不应该崩溃,或者如果它崩溃了,它应该是不可见的。我想吃掉每一个未处理的异常并假装它没有发生,“这不仅是不可能的,而且实际上违背了良好设计的每一个原则(特别是“快速失败”原则,这一原则当然可以重新解释,但决不应被完全忽略)。

    我只能这么说。如果你不愿意接受,那么祝你找到一个可行的选择。

        2
  •  0
  •   C. Dragon 76    15 年前

    visual studio可能设置为在异常时中断,但如果继续单步执行代码,它仍应遵循所需的路径。你也应该尝试在VS之外运行应用程序。

    在未处理的异常之后重新启动应用程序是个坏主意,因为(根据定义)您处于未知状态。如果异常条件从未改变,重新启动(如果可能的话)可能会使您陷入一个永无止境的重新启动循环。相反,请考虑尝试将异常信息记录到Web服务器,以便可以调查和修复崩溃。不过,在上载崩溃数据之前,请确保获得用户的权限。

    推荐文章