我刚刚开始研究现有的大项目。其中一些包含遗留代码 我被要求编写一个组件(将在同一个进程中运行),该组件应在发生致命错误或发生情况时发出警报并重新启动服务器。
例如,当抛出OutOfMemoryException时,我应该警告客户端,然后重新启动服务器。问题是,搜索所有现有的Try-catch块然后编辑并向其catch块添加新代码将是困难和耗时的。更重要的是,新的程序员可以添加一个新的try-catch块,如果捕获了OutOfMemoryException则忘记警告。
您是否知道如何监视/侦听OutOfMemoryException(以及类似的异常),而无需查找和编辑(并可能添加)每个现有和未来的Try-catch块?
我正在使用.Net 4.
编辑:
答案 0 :(得分:5)
这正是您应该修复OutOfMemoryException
的原因..而不是试图抓住它。它可以随时随地抛出。
此外..它是一个内存不足异常..你有什么保证,这个进程有足够的内存来处理它?你没有。
答案 1 :(得分:3)
值得一提的是使用app域方法。您创建新应用程序,在应用程序中创建一个执行旧代码的新应用程序域。您的代码有一个try ... catch块,例如
try {
// Execute legacy code app domain.
} catch (OutOfMemoryException ex) {
// Do whatever you need.
}
这里有一些文章可以帮助你:
http://gavindraper.com/2012/01/31/app-domains-and-their-uses/
由于OOM例外将发生在旧版应用程序域的应用程序域中,因此不应影响新代码的应用程序域(即由于Windows内存管理,虚拟内存)。
答案 2 :(得分:1)
[评论包装]
你应该看一下this post而不是重新思考你在做什么
OutOfMemoryException
并不总是意味着程序“内存不足”许多(甚至是Windows实习生)lib使用此ex表示其他问题,例如Image.Load(...)函数可以抛出那个前...但这不仅意味着没有足够的可用内存......还有更多的可能性......但是你仍然应该考虑什么样的前处理是继电器有用的
一种方法是使用允许你使用的Application class
来自WPF。允许您处理程序层事件的AppDomain.CurrentDomain.UnhandledException
和this.Dispatcher.UnhandledException
事件。如果你附加一个处理程序,你可以考虑哪个异常应该由Windows(崩溃)和在该事件处理程序中的IS handeled(通过设置e.Handled)“handeled”