使用瞬态故障处理应用程序块避免调试器暂停

时间:2013-02-20 13:21:29

标签: c# azure visual-studio-debugging transient

我开始使用瞬态故障处理应用程序块(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;
}

这个解决方案很丑陋并且在运行时降低了性能(没有附带调试器)并且需要不必要的更多编码来解决调试器中的问题。社区的意见我会很高兴。有更好的方法吗?

0 个答案:

没有答案