【发布时间】:2016-02-22 08:14:52
【问题描述】:
我正在尝试找到关于该问题的答案,即:
下面的代码是一个好习惯吗?
我是否应该尽可能地复制它?如果不是,为什么?
public class ExceptionHelper
{
private static readonly HttpException _errorReadingRequest = new HttpException(500, "Error reading request. Buffer is empty.");
public static Exception ErrorReadingRequest { get { return _errorReadingRequest; } }
}
public class ExceptionThrower
{
public static void ThrowCached1()
{
throw ExceptionHelper.ErrorReadingRequest;
}
// ...
}
我尝试将缓存的实例扔到几个地方,它似乎保留了堆栈跟踪,from MSDN,
堆栈跟踪从抛出异常的语句开始 并在捕获异常的 catch 语句处结束。意识到 在决定将 throw 语句放置在何处时考虑到这一事实。
我理解为“它将堆栈跟踪存储在抛出时,而不是在创建时”。但是,我想知道当多个线程尝试抛出同一个缓存的异常实例时是否会出现问题。
在同一个 MDSN 页面上,他们使用了一个辅助函数,而且在框架中,他们似乎也在做同样的事情:重新创建异常并抛出异常的辅助函数。
注意:我知道这不是一种常见情况,因为大多数时候,您希望将特定消息存储在异常中,以便更容易理解正在发生的事情。
也许问题只是 throw 关键字 thread safe 还是 not?
上下文:
我在审查一些性能敏感的应用程序代码时偶然发现了这种代码。目标是在启动期间创建最大的实例,然后在执行期间从不(或几乎从不)实例,以限制 GC 性能影响(特别是因为GCHandle 事物发生的堆碎片)。我对这段代码有一种不好的感觉,但需要事实来支持我的重构。
【问题讨论】:
-
为什么要缓存它?你看到了什么好处?我很好奇,因为我没有看到任何真正的好处。
-
在某些特定应用程序中,当您不想在执行期间创建任何实例时(或限制 GC 性能影响的最小值)。顺便说一句,我发现了这种代码,想知道它是否有效。好像没有。
-
如您所见,早期优化仍然是根本...
标签: c# multithreading exception caching exception-handling