回答
这取决于你的意思是“崩溃”。如果你的意思是一个未处理的异常,你可以为Application.ThreadException创建一个处理程序。如果崩溃是在托管代码之外引起的,那么您就无能为力。
我希望得到的是某种可重写的“Terminate”函数,我可以编写这个函数,这个函数被调用了未处理的异常,访问冲突或其他任何可以取消我的应用程序。大部分工作都是由C++ DLL完成的,所以处理异常也很好。 – Warpin 2010-03-19 23:06:10
这就是try {} finally {}
的用途。将所有的代码包裹在你的main
方法中,应该这样做。
在简单场景中,这可能已经足够好了,但多线程应用程序又如何呢? – 2010-03-19 23:16:05
这取决于你的意思是“崩溃”。
如果您想要处理任何会导致应用程序无法处理的未处理异常,则可以将事件处理程序附加到AppDomain.UnhandledException事件,然后处理事件处理程序中的任何错误。
此外,在.Net 4.0中有一个AppDomain.FirstChanceException,在发生异常时执行任何catch块之前调用。
但是,可能会发生真正的崩溃(例如从终结器抛出的异常),导致无法轻易处理的致命应用程序退出,但在大多数情况下,AppDomain.UnhandledException事件可能就足够了。
我想在任何崩溃之前调用方法。 AppDomain.FirstChanceException帮助了我。谢谢! – 2018-01-18 08:21:20
有几个事件可以通过订阅来获得异常通知。
- AppDomain.UnhandledException - 由应用程序域中未处理的异常触发。
- Dispatcher.UnhandledException - 触发WPF发布线程上未处理的异常。
- Application.ThreadException - 由未处理的后台线程异常触发。
另外,正如其他人所提到的,围绕单个入口点的finally块将在主线程中遇到任何异常。
[我不建议尝试从这些处理程序中恢复您的应用程序。特别是在AppDomain.UnhandledException事件的情况下,你的应用程序已经出来了,你应该让它关闭。只使用这些处理程序进行最后一分钟的清理或日志记录。]
如果您的应用程序崩溃,那么尝试执行清理代码并不安全,您不知道什么已损坏,直到您的应用程序实际退出,文件可能被锁定等。
所以我建议你把这个清理代码放在应用程序启动。让您的应用程序在启动之前查找临时文件等,然后才能创建正常的临时文件(如果它找到它们),那么它可以删除它们或尝试修复/重新使用它们。
为了实现这一点,您可以让应用程序写入一个临时文件的日志,它创建并删除该日志文件,当它关闭成功。这样,当你在启动时发现日志文件时,你知道最后一次运行是崩溃,并且你必须进行清理。
当然,如果允许应用程序的多个实例同时运行,这会变得更加复杂,但同样适用于在崩溃时进行清理。
如果您的应用程序清理至关重要,则可以创建一个监视器应用程序,该应用程序将是用户实际启动的应用程序。它会启动你的主应用程序,然后监视它的进程句柄。如果你的主应用程序崩溃,它的进程句柄将发出信号,你的显示器应用程序可以清理,甚至如果你愿意重新启动主应用程序。我通常将它与一个已命名的互斥锁结合使用,该互斥锁用于向监视器应用程序发回主应用程序希望关闭的信号,以便它不会重新启动它。
- 1. Android应用程序在执行通知代码时崩溃
- 2. 如果应用程序崩溃,执行代码?
- 3. 未执行代码崩溃
- 4. 下面的代码运行时,iOS应用程序崩溃
- 5. 在yesod应用程序运行时崩溃记录卡崩溃
- 6. Android:应用程序在AsyncTask中执行httpclient.execute时崩溃
- 7. 框架代码在应用程序崩溃时暴露 - iOS
- 8. NSFileManager崩溃在应用程序代理
- 9. 当执行函数时,应用程序崩溃Python
- 10. 执行静音按钮时,应用程序崩溃
- 11. wxwidget应用程序崩溃,当我添加代码来执行拖放
- 12. 我的代码编译,执行但程序崩溃到底
- 13. Android的运行应用程序 - 代码符合但崩溃
- 14. 应用程序崩溃当我运行我的Vidyo代码
- 15. React应用程序在本地运行,崩溃时Heroku错误代码= H10
- 16. 延迟执行代码无崩溃
- 17. C + + std ::线程在执行时崩溃
- 18. 应用程序在恢复时崩溃
- 19. 应用程序在打开时崩溃
- 20. 在应用程序崩溃时退出
- 21. 应用程序崩溃时在IOS
- 22. 应用程序在对接时崩溃
- 23. 在android应用程序中执行getWritableDatabase()后应用程序崩溃
- 24. 由于源文件中存在未执行代码而导致运行应用程序时发生崩溃 - C++
- 25. Android应用程序在崩溃时崩溃
- 26. 如何在应用程序崩溃时捕获崩溃
- 27. 访问崩溃应用程序崩溃应用程序内ios
- 28. VB.NET 2008应用程序在执行循环期间崩溃
- 29. 的Android应用程序崩溃意外地在执行catch块
- 30. 保护应用程序免于崩溃在本机代码
“崩溃”是什么意思? – wtaniguchi 2010-03-19 22:59:18
这就是非软件工程师所说的话:导致应用程序关闭的任何事件(任何线程中未处理的异常,除以0,访问冲突,来自我的工作者DLL的C++ SEH等等)。 – Warpin 2010-03-19 23:08:12