在 Environment.Exit() 上捕获异常

Posted

技术标签:

【中文标题】在 Environment.Exit() 上捕获异常【英文标题】:Catching exception on Environment.Exit() 【发布时间】:2009-05-25 08:24:21 【问题描述】:

在我的主函数结束后,我需要返回退出代码 1。但是,我还有一个永远不会结束的线程(while(true))。所以我设法调用了Environment.Exit(1)。但是我在处理 com 对象时遇到了一些异常......

由于多种原因,我无法更改其他线程代码。你们主张怎么做?

我可以捕获来自 com 对象处理的异常吗?我还有其他返回退出代码的选项吗?

【问题讨论】:

【参考方案1】:

我建议您:附加到 ProcessExit 事件以执行任何最后机会清理或... 对线程执行 Thread.Abort 以使其在退出前完成。

AppDomain.CurrentDomain.ProcessExit +=
delegate(object sender, EventArgs e)

    Console.WriteLine("Process Exit");
;
Thread t1 = new Thread(new ThreadStart(delegate

try

    while (true)
    
        Console.WriteLine("test 1");
        Thread.Sleep(500);
    

finally

    Console.WriteLine("Terminating t1");

));

Thread t2 = new Thread(new ThreadStart(delegate

try

    while (true)
    
        Console.WriteLine("test 2");
        Thread.Sleep(500);
    

finally

    Console.WriteLine("Terminating t2");

));

t1.Start();
t2.Start();
Thread.Sleep(2000);
t2.Abort();
t2.Join();
Environment.Exit(1);

【讨论】:

Thread.Abort 被广泛认为是不好的做法-interact-sw.co.uk/iangblog/2004/11/12/cancellation。问题还指出他们无法更改其他线程代码。 @RicardOD:正是因为无法更改工作线程,您必须使用 Thread.Abort 而非您链接到的文章中建议的 volatile bool 标志技术。在进程关闭中使用 Thread.Abort 也可能不是那么糟糕,特别是如果工作线程在 while(true) 循环之外捕获 ThreadAbortException。 @RichardOD 使用Thread.Abort 是一个糟糕的想法,除了它设计用于的一种情况 - 在 AppDomain 卸载期间,中止不正常运行的线程。进程终止也意味着 AppDomain 有效地卸载,所以这实际上是一个“不像其他人那么糟糕”的用例:D【参考方案2】:

尝试使用:

Environment.ExitCode = 1;

但是;如果另一个线程不是后台线程,您将需要它退出以结束进程(退出代码在进程退出之前没有意义)。

【讨论】:

我已经尝试过了,但似乎未捕获的异常(发生在 environment.exit 期间)会删除此值。【参考方案3】:

您可以通过编写此代码来终止进程 将 myProcess 调暗为 System.Diagnostics.Process = System.Diagnostics.Process.GetCurrentProcess() myProcess.Kill()

或 环境.exit(1) 是杀死所有进程的最佳方法

http://www.zhakkas.com/affiliates/idevaffiliate.php?id=542

【讨论】:

以上是关于在 Environment.Exit() 上捕获异常的主要内容,如果未能解决你的问题,请参考以下文章

System.Environment.Exit(0) 不退出程序

在 C# 中测试 Environment.Exit()

当未使用 Environment.Exit() 时,.net 程序可以具都有哪些退出代码?

为啥 Environment.Exit() 不再终止程序?

Environment.Exit 和 Main 的简单返回 2 之间的区别

Winforms:Application.Exit vs Environment.Exit vs Form.Close