如何在出现未处理的异常后继续运行
本文关键字:异常 继续 运行 未处理 | 更新日期: 2023-09-27 18:11:45
我的应用程序中有以下代码,该代码在未处理的异常之后运行:
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
var exception = e.ExceptionObject as Exception;
if (exception != null) MessageBox.Show(exception.Message + " - " + exception.StackTrace);
}
,但即使我捕获未处理的异常,我的Windows移动应用程序关闭。如何防止关闭应用程序时,我捕获未处理的异常。我从来不想关闭我的应用程序。我想在这种情况下打开登录表单或其他任何不关闭应用程序。
所以我想要的是防止关闭应用程序从未处理的异常,如网络是down,…
我不能在每个代码中都使用try catch ....
任何想法如何防止关闭应用程序时,网络关闭或任何其他未处理的异常?
你没有。当你得到一个AppDomain未处理异常时,你的应用就不再处于稳定状态了。你到底会回到哪里?当你到了那个地步,你唯一的选择,有充分理由的,就是退出。你可以合理地安排自己再次运行以确保应用程序返回,但一个更好的主意是在其源处实际处理异常,并防止它成为UnhandledException。
在app.config中添加以下元素
<runtime>
<!-- the following setting prevents the host from closing when an unhandled exception is thrown -->
<legacyUnhandledExceptionPolicy enabled="1" />
</runtime>
您可以而且应该使用try...catch
,并在任何可能发生异常的情况下处理异常。(在像Java这样的语言中,你甚至不能编译你的代码,直到你捕获了被调用函数可能抛出的每个异常,或者显式地声明这个特定的函数不会捕获它,所以调用它的人应该做。)
如果你想尽量减少使用try...catch
的情况,一些糟糕的情况可以通过测试来避免,如果必要的条件得到满足,那么你甚至不会调用一个已知会抛出特定异常的函数。就像调用
if (myByteArray != null)
{
myIPAddress = new IPAddress(myByteArray);
}
因为这样IPAddress
构造函数就不会抛出ArgumentNullException
。
然而,在大多数情况下,这是不可能做到的,特别是在网络中,因为您无法预测在事务中间电缆是否会被切断,信号是否会丢失,数据库服务器是否会崩溃等。因此,每次连接到网络或向连接发送数据或从连接接收数据时,都应该使用try...catch
。
AppDomain.CurrentDomain。UnhandledException在任何未处理的异常上触发任何线程,但从CLR 2.0开始,CLR会在事件发生后强制关闭应用程序处理程序完成。但是,可以通过将以下内容添加到您的应用程序配置文件:
<configuration>
<runtime>
<legacyUnhandledExceptionPolicy enabled="1" />
</runtime>
</configuration>
我认为你需要使用Application。ThreadException当您订阅应用程序时。threadexeption ,未处理的异常不会击中UnhandledException,应用程序将继续运行