Avatar
1
Quốc Hưng Hoàng Beginner
Cách xử lí exception trả về từ 3rd-party library
Chào anh Dũng và mọi người

Em đang thực hiện task: tích hợp Twilio vào dự án backend của công ty.

Em định nghĩa 1 class tên MessageClient trong Service layer như sau:

import TwilioClient

class MessageClient:
    def __init__(self):
        self.twilio_client = TwilioClient(twilio_account_sid, twilio_auth_token)
    def send_message(body, from, to):
        self.twilio_client.send_message(body, from, to)

send_message có thể successful hoặc failed, nếu fail twilio sẽ raise exception, em đang phân vân liệu mình sẽ handle exception trong service layer hay trong view (API) layer?

Mong anh giải đáp giúp !

Em cảm ơn ạ.

  • Answer
exception handle
Remain: 5
2 Answers
Avatar
tvd12 Beginner
tvd12 Beginner
Trong nguyên 5 nguyên tác S.O.L.I.D thì nguyên tách liskov substitution nói rằng khi lập trình chúng ta nên thiết kế làm sao để lớp có thể bị thay thế mà không làm ảnh hưởng đến tính đúng đắn của chương trình giống như trước khi thay thế.

Vậy nếu em bắt exception ở view thì giả sử em không dùng TwilioClient nữa và em muốn thay thế nó, thì em sẽ phải update cả tầng service lẫn view, việc này gây ra tác động lớn, và dễ bị ảnh hướng đến tính đúng đắn.

Nhưng khi em bắt exception ở service, em có thể convert về 1 dạng exception do em tạo ra, để tầng view cũng có thể handle được, hoặc em có thể xử lý lỗi ở tầng service này và trả về kết quả cho view, vậy thì khi em không dùng TwilioClient nữa, em thay bằng 1 cái khác, thì em chỉ cần update tầng service mà thôi.

Vậy câu trả lời cho câu hỏi của em là nên xử lý exception ở tầng service nhé.

  • 0
  • Reply
Avatar
Bản thân em cũng nghĩ là handle ở tầng service nhưng thấy các project khác của cty lại handle ở tầng view nên bèn hỏi anh ạ.

Mặt khác, em cũng nghĩ return value của method send_message sẽ là boolean, nhưng anh có đề cập về việc convert về 1 dạng exception do em tạo ra , vậy thì return value của method có thể trông như thế này: MessageInstance/MessageSendError phải ko anh ?

  • 0
  • Reply
Có thể ở cty em mọi người cần hoàn thiện nhanh dự án nên bỏ qua các nguyên tắc em ạ.

Em có thể define 1 exception của riêng em kiểu này:

class SendMessageError(Error):
    """Send message error"""
    pass

Và sau đó em sẽ wrap lại việc send message thế này:

try:
    self.twilio_client.send_message(body, from, to)
except:
    raise SendMessageError from exc
 –  tvd12 1658646659000