mirror of
https://github.com/microsoft/BCQuality.git
synced 2026-08-06 09:26:52 +01:00
38 lines
1.4 KiB
AL
38 lines
1.4 KiB
AL
// Demonstration only. Shows the wrong pattern: raising the integration event inside a TryFunction body.
|
|
|
|
codeunit 50116 "Payment Processor Bad"
|
|
{
|
|
[IntegrationEvent(false, false)]
|
|
procedure OnBeforeSubmitPayment(var PaymentAmount: Decimal; var Cancel: Boolean)
|
|
begin
|
|
end;
|
|
|
|
procedure SubmitPayment(PaymentAmount: Decimal)
|
|
var
|
|
Success: Boolean;
|
|
begin
|
|
// TryFunction wraps both the event raise and the gateway call.
|
|
Success := TrySubmitPaymentInternal(PaymentAmount);
|
|
if not Success then
|
|
Error('Payment gateway call failed. Check connectivity and retry.');
|
|
end;
|
|
|
|
[TryFunction]
|
|
local procedure TrySubmitPaymentInternal(PaymentAmount: Decimal)
|
|
var
|
|
Cancel: Boolean;
|
|
Client: HttpClient;
|
|
Response: HttpResponseMessage;
|
|
begin
|
|
Cancel := false;
|
|
// BAD: event raised inside TryFunction. Any Error() thrown by a subscriber is caught here
|
|
// and silently swallowed - the subscriber's error never reaches the caller.
|
|
// A subscriber setting Cancel := true is also lost when TryFunction returns false.
|
|
OnBeforeSubmitPayment(PaymentAmount, Cancel);
|
|
if Cancel then
|
|
exit;
|
|
Client.Get('https://payments.example.com/submit?amount=' + Format(PaymentAmount), Response);
|
|
if not Response.IsSuccessStatusCode() then
|
|
Error('HTTP %1', Response.HttpStatusCode());
|
|
end;
|
|
}
|