我的要求是用戶將在流程結束時看到本地化訊息。如果該程序失敗,將至少有一個“外部”錯誤型別的訊息。如果該程序成功執行,用戶可能會看到多個“外部”資訊訊息。
此外,應用程式應記錄所有訊息(包括內部訊息)。
現在,棘手的部分來了。假設以下呼叫堆疊:
- 控制器.uploadImageHandler
- imageService.createImageContainer
- 畫廊服務.loadForImage
- galleryService.validateGalleryAttributes
現在validateGalleryAttributes將驗證 3 個屬性。2 不匹配,因此會生成訊息Attribute A must be X和Attribute B must not be empty型別External并將其記錄到應用程式日志中。之前的電話添加了多條資訊訊息。
現在我需要
- 中止處理
- 將訊息冒泡
將訊息集合(或將集合添加到記錄器)傳遞到每個方法,在失敗時拋出例外(即使是簡單的例外,例如無效屬性),在控制器級別提取訊息并將它們回傳給用戶?將它們添加到例外類是不夠的,因為資訊訊息也必須是可能的,并且多個方法可能只產生訊息。
但老實說,有一個在成功和例外時檢查的集合似乎有點奇怪。有更好的語言結構嗎?
uj5u.com熱心網友回復:
我可以提出兩種替代解決方案。
如果您完全喜歡 monad,則可以從使用例外轉向自定義
LoggingEither<L, R>或LoggingResult<S, E>回傳型別。他們將攜帶結果/例外以及到目前為止所有累積的訊息。您只需要確保將您呼叫的所有方法的訊息合并到您在當前方法中回傳的物件中。有關如何實作這些 monad 型別的想法,請查看vavr。如果一切都發生在同一個執行緒中,您可以考慮使用ThreadLocal來跟蹤所有日志訊息。這消除了將集合向下傳遞到堆疊跟蹤的需要。不過,您仍然需要處理捆綁訊息和重置
ThreadLocal.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/429036.html
上一篇:盡管在用于查找逆矩陣的函式中沒有零可除,但在numpy中除以零警告
下一篇:回呼轉換并從另一個物件設定
