繁体   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