簡體   English   中英

MongoDriver for Scala + http4s:如何檢查 createCollection() 是否引發異常?

[英]MongoDriver for Scala + http4s : How to check if createCollection() throws an exception?

我是 Scala - http4s 初學者。
我必須使用帶有 http4s 的 Scala 為我的工作創建一個 MVC 應用程序,但我面臨以下問題:

我無法在存儲庫中捕獲 mongo 驅動程序異常

我的任務之一是為一些請求創建新的數據庫,所以我開始在我的存儲庫中設計函數“createDatabase”。
根據文檔

MongoDatabase 實例提供了與數據庫交互的方法,但數據庫可能實際上並不存在,只會在通過某種方式插入數據時創建; 例如創建集合或插入文檔

所以我的代碼是:

    def createDatabase(databaseName: String) = {
        IO.fromFuture(IO {
           MongoClient("con_string").getDatabase(databaseName).createCollection("any_name").head()
        })
    }

期望將創建一個包含名稱為“any_name”的集合的新數據庫。

如果使用已存在的數據庫名稱調用 createDatabase ,則操作將失敗,並在控制台中輸出

com.mongodb.MongoCommandException: 命令失敗,錯誤 48 (NamespaceExists): '集合已經存在。 NS: NewDbTest.customers' 在服務器 localhost:27017 上。 完整的響應是 {"ok": 0.0, "errmsg": "Collection already exists. NS: NewDbTest.customers", "code": 48, "codeName": "NamespaceExists"}

我嘗試使用 try {} catch、Try {}、withRecover() 等等,希望能捕獲此異常並以異常消息響應,但沒有任何效果。

一些例子:

    def createDatabase(databaseName: String) = {
        IO.fromFuture(IO {
            try {        
                MongoClient("con_string").getDatabase(databaseName).createCollection("any_name").head()
            }
            catch {
                case e: MongoCommandException => println("we have exception")
                Future.successful(e.getErrorMessage)
            }
        })
    }
    def createDatabase(databaseName: String) = {
        IO.fromFuture(IO {
            client.getDatabase(databaseName).createCollection("any_name").map(operation => Try {operation}).head()
        })
    }
    def createDatabase(databaseName: String) = {
        IO.fromFuture(IO {
            client.getDatabase(databaseName).createCollection("any_name").head() recover {
                case exception: Exception => Future.successful(exception.getMessage)
            }
        })
    }

由於保密工作協議,一些片段被混淆。
請幫我。
謝謝 !

使用atempt解決了問題


    def createDatabase(databaseName: String) = {
        IO.fromFuture(IO {
           MongoClient("con_string").getDatabase(databaseName).createCollection("any_name").head()
        }).attempt
    }

但是,無論發生什么,似乎錯誤消息都是由日志記錄器在調試級別打印的。 所以我也將日志級別更改為 INFO。

Logger.getRootLogger.setLevel(Level.INFO)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM