我希望能够检测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 查询并实际捕获异常?
在新的API中,
MongoException
是一个RuntimeException.
,你可以捕获通用的MongoException
,或者我相信,listDatabaseNames()
最终会抛出一个MongoCommandException
。
您可以将
System.err
重定向到 ByteArrayOutputStream
缓冲区。如果抛出运行时异常,则会将其收集到缓冲区中。
请参阅类似问题的答案:https://stackoverflow.com/a/47699292/7388679