Skip to content

Errors

SNAP mengkodekan hasil sebuah respons dengan dua cara sekaligus: status HTTP tingkat transport, dan responseCode 7 digit yang tertanam di body JSON. Package ini memperlakukan keduanya sebagai tidak sama-sama bisa dipercaya.

Status HTTP bersifat otoritatif

func CheckResponseStatus(responseCode string, httpStatus int) error

CheckResponseStatus adalah satu-satunya pemeriksaan sukses/gagal yang otoritatif, dipakai setiap fungsi pemanggil. Status HTTP non-2xx tidak pernah dianggap sukses, meskipun responseCode itu sendiri mengklaim sebaliknya — misalnya body cache basi dari proxy yang bermasalah. Sebaliknya juga berlaku: status 2xx dengan responseCode yang hilang atau salah bentuk tetap dihitung sukses, karena tidak ada lagi yang bisa dijadikan pembanding.

Mengembalikan nil untuk sukses, atau salah satu sentinel error di bawah.

Struktur responseCode

func ParseResponseCode(code string) (httpStatus int, serviceCode, caseCode string, err error)

Memecah responseCode SNAP 7 karakter menjadi HTTPStatus(3) + ServiceCode(2) + CaseCode(2). Mengembalikan error non-nil untuk apa pun yang bukan tepat 7 digit.

func ResponseCodeError(code string) error

Mem-parsing code dan mengembalikan sentinel yang cocok dengan kelas status HTTP-nya, dibungkus %w di sekitar kode mentahnya supaya Anda bisa mengambilnya kembali sambil tetap mencocokkan kelasnya lewat errors.Is. Kelas yang tidak dikenal mengembalikan ErrUnmappedResponseCode, dibungkus dengan cara yang sama — tidak pernah nil.

Sentinel error

Satu sentinel per kelas status HTTP yang didokumentasikan di tabel response-code standar. Cocokkan dengan errors.Is, terlepas dari case code spesifiknya:

SentinelKelas HTTP
ErrBadRequest400
ErrUnauthorized401
ErrForbidden403
ErrNotFound404
ErrInternalServerError500
ErrServiceUnavailable503
ErrTimeout504
ErrUnmappedResponseCodekelas lain/salah bentuk
resp, err := balanceinfo.BalanceInquiry(ctx, transport, hb, req)
if err != nil {
	if errors.Is(err, snap.ErrUnauthorized) {
		// refresh access token lalu coba lagi
	}
	if errors.Is(err, snap.ErrTimeout) {
		// aman di-retry hanya bila panggilan ini idempotent — lihat
		// catatan idempotency masing-masing endpoint di halaman referensi
	}
}

Input yang tidak dipercaya di pesan error

func TruncateForError(s string) string

Membatasi string yang tidak dipercaya sebelum disisipkan ke pesan error, supaya input yang sangat besar tidak menghasilkan string error yang proporsional besarnya (dan biasanya ikut ter-log). Di-export supaya jalur error input-tidak-dipercaya milik subpackage domain sendiri (mis. custIDMerchant di registration.CardRegistrationInquiry) bisa memakainya juga — pakai ini bila Anda membuat pembungkus error sendiri di sekitar nilai yang berasal dari pemanggil.

Selanjutnya