ما هي بعض تطبيقات تصفية الاستثناء في نمط قواطع الدائرة؟

StackOverflow https://stackoverflow.com/questions/2043419

سؤال

ال نمط قواطع الدائرة, ، من الكتاب افرج عنه!, ، يحمي خدمة عن بعد من الطلبات أثناء الفشل (أو التعافي) ويساعد العميل في إدارة فشل الخدمة البعيد المتكررة. انا يعجبني قواطع الدائرة الدائرية ديفي بريون و إصلاح مهلة Ayende الكسولة نظيفة جدا.

ومع ذلك، لم أر الكثير من تطبيقات التصفية الاستثناءات التي سيؤدي إلى زيادة في عدد فشل قواطع الدائرة.


لا تقلق بشأن إظهار قفل، ما لم يكن تنفيذك يعتمد بشكل خاص على قفل ذكي. لمعلوماتك، فيل هاك يظهر أحدث نسخة من TimeDlock, ، المستخدمة في مقالات ديفي بريون.

هل كانت مفيدة؟

المحلول

تصفية عن طريق المسند

أ فاعل يمكن أن توفر المعايير الموسعة ومنطق الترشيح.

public void AttemptCall(Action action, Predicate<Exception> match)
{
    try
    {
        action();
    }
    catch(Exception e)
    {
        if(match(e))
            state.ActUponException(e);

        throw;
    }
}

على سبيل المثال، قد ترغب في زيادة قواطع الدائرة فقط على WebException الناجمة عن مهلة.

circuitBreaker.AttemptCall(() => service.DoWork(), e =>
    {
        WebException local = e as WebException;
        if(local == null)
            return false;

        return local.Status == WebExceptionStatus.Timeout;
    });

نصائح أخرى

تصفية الأنواع التي سوف تزيد العد

قد يكون الفكر الأول لبناء مكالمة طريقة عامة مع عام try... catch منع. ومع ذلك، لن يعمل أدناه بسبب .NET BUG.NET, ، يرجى الاطلاع هؤلاء أسئلة للمزيد من المعلومات.

public void AttemptCall<TException>(Action action)
    where TException : Exception
{
    try
    {
        action();
    }
    catch(TException e)
    {
         state.ActUponExcpetion(e);
         throw;
    }
}

تحتاج إلى قبض على جميع الاستثناءات والتحقيق في النوع.

public void AttemptCall<TException>(Action action)
    where TException : Exception
{
    try
    {
        action();
    }
    catch(TException e)
    {
         if(e is TException)
             state.ActUponExcpetion(e);

         throw;
    }
}

تصفية الأنواع لن تزيد من العدد

كتب تيم روس عن هذا.

private readonly List<Exception> ignored = new List<Exception>();

public void Ignore<TException>() 
    where TException : Exception
{
    Type type = typeof(TException);
    if(ignored.Contains(type))
        return;

    ignored.Add(type);
}

public void AttemptCall(Action action)
{
     try
     {
         action();
     }
     catch(Exception e)
     {
         if(!ignore.Contains(e.GetType()))
             state.ActUponException(e);

         throw;
     }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top