Ответ 1
В новом API MongoException
есть RuntimeException.
Вы можете либо поймать общий MongoException
, либо, я полагаю, listDatabaseNames()
в конечном итоге бросает MongoCommandException
в конечном итоге.
Я хочу, чтобы определить, доступен ли mongo-сервер из драйвера java для реагирования на любые аномальные события, как на земле 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()
, который выдает ошибки MongoException
, если только это не устарело и заменено на MongoClient.listDatabaseNames()
не имеет той же семантики метаданных ошибок.
Есть ли способ просто выполнить запрос mongo из java-драйвера в блоке try catch и на самом деле исключить исключение?
В новом API MongoException
есть RuntimeException.
Вы можете либо поймать общий MongoException
, либо, я полагаю, listDatabaseNames()
в конечном итоге бросает MongoCommandException
в конечном итоге.
Вы можете перенаправить System.err
в буфер ByteArrayOutputStream
. Если выбрано исключение времени выполнения, оно будет собрано в буфер.
См. Ответ на аналогичную проблему: fooobar.com/info/555895/...