我开始将瞬态故障处理应用程序块 (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)
...
}
该代码使用辅助结构:
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;
}
这个解决方案很丑陋,并且会稍微降低运行时的性能(没有附加调试器),并且需要更多不必要的编码来解决调试器中的问题。我很乐意听取社区的意见。有更好的方法吗?