【问题标题】:java mongodb driver how do you catch exceptions?java mongodb驱动程序如何捕获异常?
【发布时间】:2016-01-02 09:36:26
【问题描述】:

我希望能够检测 java 驱动程序中是否有可用的 mongo 服务器,以便像在 JDBC 领域等中那样对任何异常事件做出反应。服务器启动时一切正常,但我正在努力了解为什么检测错误如此困难。我有一种感觉,因为 mongo 客户端在不同的线程中运行并且它不会重新抛出给我或其他什么?

try {
        MongoClient mongoClient = new MongoClient("localhost", 27017);
        MongoDatabase db = mongoClient.getDatabase("mydb");
        // if db is down or error getting people collection handle it in catch block
        MongoCollection<Document> people = commentarr.getCollection("people");
    } catch (Exception e) {
        // handle server down or failed query here.
    }

结果是

INFO: Exception in monitor thread while connecting to server localhost:27017

生成的堆栈跟踪包含一些我试图捕获的不同异常,但我的 catch 块仍然没有做任何事情。

com.mongodb.MongoSocketOpenException: Exception opening socket
Caused by: java.net.ConnectException: Connection refused

我正在使用 java mongodb 驱动程序 3.0.4,我阅读的大多数帖子都来自较旧的 API,其中包含 MongoClient.getDatabaseNames() 之类的 hack,如果出现错误,则会引发 MongoException,但现在已弃用并替换为 MongoClient.listDatabaseNames()没有相同的错误抛出语义。

有没有办法只在 try catch 块中从 java 驱动程序执行一个 mongo 查询并实际捕获异常?

【问题讨论】:

标签: mongodb-java


【解决方案1】:

在新的 API 中,MongoExceptionRuntimeException. 您可以捕获通用的 MongoException,或者我相信 listDatabaseNames() 最终会抛出 MongoCommandException

【讨论】:

  • 谢谢,我尝试了列出的异常,但不幸的是仍然没有捕获到异常。
  • 你试过抓MongoSocketOpenException吗?那就是你正在积极看到的那个。可能是因为 mongo 实际上并没有运行(或在那个端口上)。
  • 是的,我已经尝试过那个和其他大约 10 个,但没有一个被捕获块捕获。到目前为止,为了检测服务器何时关闭,我能捕捉到的唯一异常是MongoTimeoutException,无论您通过MongoClientOptions.builder().serverSelectionTime() 设置多少毫秒,它都会被抛出。我只是暂时这样做。
  • 不幸的是,这仍然没有捕获异常
【解决方案2】:

您可以将System.err 重定向到ByteArrayOutputStream 缓冲区。如果抛出运行时异常,它将被收集到缓冲区中。 查看类似问题的答案:https://stackoverflow.com/a/47699292/7388679

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2016-06-15
    • 1970-01-01
    • 2016-02-28
    相关资源
    最近更新 更多