我开始使用瞬态故障处理应用程序块(TFHAB)和Azure缓存。它很容易使用但是在调试器中时,缓存提供程序中抛出的错误并从TFHAB传递出来而不是瞬态停止调试器声明 'MyLib.dll中出现类型'Microsoft.ApplicationServer.Caching.DataCacheException'的例外,但未在用户代码中处理' 尽管调用包含在try / catch块中。代码是这样的:
UserData cacheItem;
try
{
cacheItem = RetryPolicyFix.ExecuteAction(() => dataCache.GetAndLock(...) as UserData;
}
catch (DataCacheException e)
{
if (e.ErrorCode == DataCacheErrorCode.ObjectLocked)
...
}
在调试代码的其他部分时,这些错误停止会中断,这真的很烦人。
我经历了很多讨论,最后得到了解决方法。
UserData cacheItem;
try
{
var res = RetryPolicyFix.ExecuteAction(
() =>
{
try
{
var data = dataCache.GetAndLock(...) as UserData;
return new TFHResult(data);
}
catch (DataCacheException ex)
{
// transient error should pass through as the TFHAB is responsible for its handling
if (RetryPolicyFix.ErrorDetectionStrategy.IsTransient(ex))
throw;
return new TFHResult(ex);
}
});
if (res.Error != null)
throw res.Error;
cacheItem = res.Data;
}
catch (DataCacheException e)
{
if (e.ErrorCode == DataCacheErrorCode.ObjectLocked)
...
}
代码使用helper struct:
private struct TFHResult
{
public TFHResult(DataCacheException error)
{
Error = error;
Data = null;
}
public TFHResult(UserDirectoryMappingData data)
{
Error = null;
Data = data;
}
public DataCacheException Error;
public UserDirectoryMappingData Data;
}
这个解决方案很丑陋并且在运行时降低了性能(没有附带调试器)并且需要不必要的更多编码来解决调试器中的问题。社区的意见我会很高兴。有更好的方法吗?