OutOfMemoryException陷阱/事件(在try-catch旁边)

时间:2013-08-04 11:02:32

标签: c# .net exception out-of-memory

我刚刚开始研究现有的大项目。其中一些包含遗留代码 我被要求编写一个组件(将在同一个进程中运行),该组件应在发生致命错误或发生情况时发出警报并重新启动服务器。

例如,当抛出OutOfMemoryException时,我应该警告客户端,然后重新启动服务器。问题是,搜索所有现有的Try-catch块然后编辑并向其catch块添加新代码将是困难和耗时的。更重要的是,新的程序员可以添加一个新的try-catch块,如果捕获了OutOfMemoryException则忘记警告。

您是否知道如何监视/侦听OutOfMemoryException(以及类似的异常),而无需查找和编辑(并可能添加)每个现有和未来的Try-catch块?

我正在使用.Net 4.

编辑:

  1. OutOfMemoryException只是一个例子。
  2. 可能存在捕获OutOfMemoryException的遗留代码,将消息打印到日志然后什么都不做。

3 个答案:

答案 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/

http://www.superstarcoders.com/blogs/posts/executing-code-in-a-separate-application-domain-using-c-sharp.aspx

由于OOM例外将发生在旧版应用程序域的应用程序域中,因此不应影响新代码的应用程序域(即由于Windows内存管理,虚拟内存)。

答案 2 :(得分:1)

[评论包装]

你应该看一下this post而不是重新思考你在做什么

OutOfMemoryException并不总是意味着程序“内存不足”许多(甚至是Windows实习生)lib使用此ex表示其他问题,例如Image.Load(...)函数可以抛出那个前...但这不仅意味着没有足够的可用内存......还有更多的可能性......但是你仍然应该考虑什么样的前处理是继电器有用的

一种方法是使用允许你使用的Application class来自WPF。允许您处理程序层事件的AppDomain.CurrentDomain.UnhandledExceptionthis.Dispatcher.UnhandledException事件。如果你附加一个处理程序,你可以考虑哪个异常应该由Windows(崩溃)和在该事件处理程序中的IS handeled(通过设置e.Handled)“handeled”