2015-03-10 13 views
6

Jak mogę ponownie użyć kodu obsługi wyjątków dla wielu funkcji w Pythonie?Jak mogę ponownie użyć kodu obsługi wyjątków dla wielu funkcji w Pythonie?

Pracuję nad projektem, który będzie korzystać z biblioteki Stripe Python. https://stripe.com/docs/api/python#errors

To przykład kodu z ich dokumentów.

try: 
    # Use Stripe's bindings... 
    pass 
except stripe.error.CardError, e: 
    # Since it's a decline, stripe.error.CardError will be caught 
    body = e.json_body 
    err = body['error'] 

    print "Status is: %s" % e.http_status 
    print "Type is: %s" % err['type'] 
    print "Code is: %s" % err['code'] 
    # param is '' in this case 
    print "Param is: %s" % err['param'] 
    print "Message is: %s" % err['message'] 
except stripe.error.InvalidRequestError, e: 
    # Invalid parameters were supplied to Stripe's API 
    pass 
except stripe.error.AuthenticationError, e: 
    # Authentication with Stripe's API failed 
    # (maybe you changed API keys recently) 
    pass 
except stripe.error.APIConnectionError, e: 
    # Network communication with Stripe failed 
    pass 
except stripe.error.StripeError, e: 
    # Display a very generic error to the user, and maybe send 
    # yourself an email 
    pass 
except Exception, e: 
    # Something else happened, completely unrelated to Stripe 
    pass 

Muszę napisać kilka funkcji, które wykonują różne wywołania w systemie Stripe w celu przetwarzania moich transakcji. Na przykład; odzyskać token, utworzyć klienta, obciążyć kartę itd. Czy muszę powtórzyć kod try/except w każdej funkcji, czy istnieje sposób na dynamiczne przekształcanie zawartości bloku try?

Chciałbym używać tych różnych funkcji w moim widoku widoku kodu jako warunków warunkowych, więc jeśli mógłbym otrzymać komunikat o błędzie/sukcesie od każdego z nich, byłoby to pomocne.

+0

Czy brałeś pod uwagę dekoratora? – jonrsharpe

+0

Tutaj można również użyć menedżera kontekstów, jeśli nie chcesz, aby obsługa wyjątków była stosowana do całej funkcji. – dano

Odpowiedz

7

Napisz dekoratora, który wywołuje upiększony widok w bloku try i obsługuje wszelkie wyjątki związane z paskiem.

from functools import wraps 

def handle_stripe(f): 
    @wraps(f) 
    def decorated(*args, **kwargs): 
     try: 
      return f(*args, **kwargs) 
     except MyStripeException as e: 
      return my_exception_response 
     except OtherStripeException as e: 
      return other_response 

    return decorated 

@app.route('/my_stripe_route') 
@handle_stripe 
def my_stripe_route(): 
    do_stripe_stuff() 
    return my_response 
Powiązane problemy