0

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

例如,当抛出 OutOfMemoryException 时,我应该提醒客户端,然后重新启动服务器。问题是,搜索所有现有的 Try-catch 块然后编辑并将新代码添加到它们的 catch 块将是困难且耗时的。不仅如此,新程序员可能会添加一个新的 try-catch 块而忘记在 OutOfMemoryException 被捕获时发出警报。

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

我正在使用.Net 4。

编辑:

  1. OutOfMemoryException 只是一个例子。
  2. 可能存在捕获 OutOfMemoryException 的遗留代码,打印一条消息以记录然后什么也不做。
4

3 回答 3

5

这正是您应该修复OutOfMemoryException.. 而不是试图抓住它的原因。它可以从任何地方......在任何时候抛出。

此外..这是一个内存不足异常..您有什么保证该进程将有足够的内存来处理它?你没有。

于 2013-08-04T11:04:50.393 回答
3

值得一试的是使用应用程序域方法。您创建新应用程序,在应用程序中创建执行旧代码的新应用程序域。您的代码有一个 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 内存管理、虚拟内存)。

于 2013-08-04T11:18:49.130 回答
1

[评论包装]

你应该看看这篇文章,而不是重新考虑你在做什么

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

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

于 2013-08-04T12:46:03.753 回答