2017-03-22 87 views
3

我認爲使用Polly來創建策略來記錄異常並重新拋出。 我沒有找到一個現有的方法,允許它開箱即用,但有些選項,我看到的是Polly策略來記錄異常並重新拋出

後備

// Specify a substitute value or func, calling an action (eg for logging) if the fallback is invoked. 
Policy.Handle<Whatever>() 
.Fallback<UserAvatar>(UserAvatar.Blank, onFallback: (exception, context) => 
    { _logger.Log(exception, context); 
     throw exception; 
    }); 

問:是否確定從後備拋出異常?

超時

Policy.Timeout(1, T30meoutStrategy.Pessimistic, (context, timespan, task) => 
    {  task.ContinueWith(t => 
{ // ContinueWith important!: the abandoned task may very well still be executing, when the caller times out on waiting for it!  
    if (t.IsFaulted  )   
    {    
     logger.Error(context,t.Exception);   
     throw exception; 
    } );  

或者重試

Policy.Handle<DivideByZeroException>().Retry(0, (exception, retryCount) => 
    {    logger.Error(context,exception);   
throw exception; 
    } ); 

問題:支持0重試?

或KISS並寫簡單的嘗試/捕獲與自己扔。

哪種方法比較好? 您的建議是?

+0

如果我能賞金你的問題我會的。這個問題非常有幫助! –

回答

3

如果您還沒有混合使用波莉,那麼嘗試/捕捉似乎是最簡單的。

如果你已經有了波莉混合,FallbackPolicy可以安全地重新利用在你建議的方式。 onFallback代表和後備操作或值are not governed by the .Handle<>() clauses of the Policy,因此您可以安全地重新拋出onFallback代表內的異常。

Policy<UserAvatar>.Handle<Whatever>() 
.Fallback<UserAvatar>(UserAvatar.Blank, onFallback: (exception, context) => 
    { _logger.Log(exception, context); 
     throw exception; 
    }); 

你的問題與TimeoutPolicy概括只會捕捉異常,由代表拋出主叫此前走開因爲超時,只有在TimeoutMode.Pessimistic的方法;並非所有例外。


您的問題與.Retry(0, ...)概述的方法不起作用。如果未指定重試,則不會調用onRetry委託。


爲了避免重複利用FallbackPolicy的不整潔,你也可以編寫自己的LogThenRethrowPolicy,波莉的結構中。 This commit(其中添加了簡單的NoOpPolicy)舉例說明了添加新策略所需的最低限度。你可以添加類似NoOpPolicy的實現只是try { } catch { /* log; rethrow */ }