Как обрабатывать ошибки в контроллере с вложенными сервисами?Python

Программы на Python
Ответить
Anonymous
 Как обрабатывать ошибки в контроллере с вложенными сервисами?

Сообщение Anonymous »

В настоящее время я разрабатываю серверную часть веб-приложения. В одной из моих конечных точек есть три разных служебных вызова:
- Первый служебный вызов: вызывает внешнюю конечную точку для регистрации платежа. Он возвращает объект Payment.

- Второй вызов службы: используя объект Payment, возвращенный при первом вызове, вызывает внешнюю конечную точку для проверки этого платежа. Возвращает номер подтверждения и URL-адрес.

- Третий вызов службы: вызывает внешнюю конечную точку, чтобы добавить в таблицу Google информацию о платеже, номере подтверждения и URL-адресе, полученную ранее.
Во всех этих службах выполняются записи в базу данных моей собственной системы и вызовы внешних API, которые создают записи во внешней базе данных (за исключением последнего вызова службы, где запись находится только в листе Google).
Мой вопрос: как я могу справиться с ошибкой, возникающей после первого или второго вызова службы? Предположим, что по какой-то причине третий сервис возвращает ошибку. Первая и вторая операции уже были выполнены, и я не могу отменить то, что уже было сделано во внешней базе данных. Итак, как лучше всего справиться с этими вложенными случаями? Я думал о вложенных обработчиках try-Exception, но не уверен, что часть «кроме» будет делать во внешних вызовах API, поскольку нет возможности их откатить.
Если вы хотите лучше понять, это моя конечная точка. Написан на Python
@endpoint(route="register-payment", methods=["POST"])
@staticmethod
def register_payment(http_request: Request) -> RestResponse:

request = RegisterPaymentRequest.model_validate_json(http_request.body)

payment = InsuranceService.register_payment(
transaction_id=request.transaction_id,
payment_id=request.payment_id,
amount=request.amount,
invoice_id_list=request.invoice_id_list,
)

invoices = []
for invoice_id in request.invoice_id_list:
invoice = InvoiceRepository.filter(
idefact=invoice_id,
).first()
if invoice:
invoices.append(invoice)

verification = InsuranceService.verify_payment(
register_id=payment.register_id,
invoices = invoices
)

SheetsService.write_payment(
invoices=invoices,
payment=payment,
numreling=verification.numreling,
urlrep=verification.urlrep
)

return RestResponse(
status=rest_status.HTTP_200_OK,
data=Response(
code="0",
error=False,
message="Payment validated successfully",
data={
"numreling": verification.numreling,
"urlrep": verification.urlrep
},
).to_dict(),
)


Подробнее здесь: https://stackoverflow.com/questions/798 ... d-services
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»