iT邦幫忙

2021 iThome 鐵人賽

DAY 24
0

Boxenn 的 error handling

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 總回顧及範例程式碼。


上一篇
[DAY23] Boxenn Use Case & Validation
下一篇
[DAY25] Boxenn 小結
系列文
在 Ruby on Rails 中導入 Domain-Driven Design 是不是搞錯了什麼?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言