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) errorCheckResponseStatus 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) errorMem-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:
| Sentinel | Kelas HTTP |
|---|---|
ErrBadRequest | 400 |
ErrUnauthorized | 401 |
ErrForbidden | 403 |
ErrNotFound | 404 |
ErrInternalServerError | 500 |
ErrServiceUnavailable | 503 |
ErrTimeout | 504 |
ErrUnmappedResponseCode | kelas 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) stringMembatasi 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.