Boxenn 的實作可以在這邊複習。
Use Case 中的 error 可以分為兩種,可預期的錯誤和不可預期的錯誤。
預期的錯誤只要在 method 中回傳 Failure
物件即可:
def send_marketing_email(email)
return Failure('已傳送過此訊息') if email.sent_at.present?
email.sent
Success()
end
這樣一來只要符合錯誤邏輯,就不會往下繼續執行,並回傳指定的物件。
這邊回傳可以給任何物件,不過我們通常會直接回傳
string
,讓 controller 可以直接告知使用者錯誤訊息。
另一種則是非預期的錯誤,這類型的錯誤會被 Boxenn::UseCase
rescue,然後包在 Array
裡:
# Boxenn::UseCase
rescue StandardError => e
Failure.new([e], trace: e.backtrace.first)
end
而不管是哪種類型的錯誤都需要在 call use case 的地方額外處理,否則程式會繼續往下跑。
額外處理的方式可能是打通知到 slack、打資料到錯誤管理平台 rollbar 等等:
result = use_case.new.call
if result.failure?
Slack.notify('錯誤')
Rollbar.error('錯誤')
end
通常同一個 use case 處理錯誤的方式需要一致,但上述的寫法會把處理過程寫在 use case 外,導致只要有呼叫 use case 的地方就會再寫相同的程式碼。這是我們實際使用後想再加以改良之處。
下篇是 Boxenn 總回顧及範例程式碼。