我有一个使用Stripe处理信用卡的rails应用程序。目前,在事务发生的任何地方都会处理几个异常。下面的代码目前正在11个地方使用。在所有地方,除了传递给stripe_error的消息外,这基本上是一样的。是否有可能创建一个可重用的代码片段,可以在所有这些地方使用?
begin
charge = Stripe::Charge.retrieve(@purchase.stripe_charge_id)
resp = charge.capture(amount: fee.cancellation_fee,
receipt_email: @customer.email)
@purchase.update_attributes(
accepted_charge: true,
stripe_transaction_id: resp['balance_transaction']
)
logger.info("Charged customer for cancellation #{@customer.id} #{@purchase.total_fee}")
event('cancellation_charge', 'purchase_id', @purchase.id,
fee: @purchase.total_fee, customer_id: @purchase.customer_id,
provider_id: @purchase.provider_id)
purchase_set_md5(@purchase.id)
rescue Stripe::CardError => e
@err = stripe_error(e, 'cancellation', fee.cancellation_fee)
@purchase.update_attributes(
accepted_charge: false,
charge_errors: message,
stripe_transaction_id: '',
status: "Cancellation fee charge did not go through #{@err['message']}"
)
purchase_set_md5(@purchase.id)
render :err_show, status: :payment_required, json: @err
return
rescue Stripe::InvalidRequestError => e
@err = stripe_error(e, 'cancellation_invalid_request', fee.cancellation_fee)
render :err_show, status: :payment_required, json: @err
return
rescue Stripe::AuthenticationError => e
@err = stripe_error(e, 'cancellation_authentication', fee.cancellation_fee)
render :err_show, status: :payment_required, json: @err
return
rescue Stripe::APIConnectionError => e
@err = stripe_error(e, 'cancellation_api_connect', fee.cancellation_fee)
render :err_show, status: :payment_required, json: @err
return
rescue Stripe::StripeError => e
@err = stripe_error(e, 'cancellation_generic error', fee.cancellation_fee)
render :err_show, status: :payment_required, json: @err
return
rescue => e
@err = stripe_error(e, 'cancellation_something_else', fee.cancellation_fee)
render :err_show, status: :payment_required, json: @err
return
end def stripe_error(e, charge_type, fee = 0)
logger.error("e #{e}")
err = {
charge_type: charge_type,
errcode: ERR_STRIPE_ERR,
message: "#{e}"
}
event(charge_type, 'error', "#{e}")
logger.error("Charging error on #{charge_type} purchase for #{fee} ")
logger.error("type #{e} ")
err
end发布于 2015-07-08 02:46:58
您的第一步将是将实际呈现的错误消息与拯救异常分开:
def render_errors(errors, template: :err_show, status: :payment_required)
render template, status: status, json: errors
end那么,您能将大多数例外情况分组吗:
rescue Stripe::InvalidRequestError,
Stripe::AuthenticationError
Stripe::APIConnectionError,
Stripe::StripeError => e
render_errors( stripe_error(e) )一个好主意是将错误的生成和日志记录分开。
https://codereview.stackexchange.com/questions/90702
复制相似问题