Java mongodb driver, как вы поймаете исключения?

Я хочу, чтобы определить, доступен ли 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 и на самом деле исключить исключение?

Ответ 1

В новом API MongoException есть RuntimeException. Вы можете либо поймать общий MongoException, либо, я полагаю, listDatabaseNames() в конечном итоге бросает MongoCommandException в конечном итоге.

Ответ 2

Вы можете перенаправить System.err в буфер ByteArrayOutputStream. Если выбрано исключение времени выполнения, оно будет собрано в буфер. См. Ответ на аналогичную проблему: fooobar.com/info/555895/...