2016-01-02 12 views
10

Ich möchte in der Lage zu erkennen, ob ein Mongo-Server von dem Java-Treiber für den Zweck der Reaktion auf abnormale Ereignisse wie in JDBC Land usw. verfügbar ist. Alles funktioniert gut, wenn der Server auf, aber ich habe zu kämpfen zu verstehen, warum es so schwierig ist, Fehler zu erkennen. Ich habe ein Gefühl, weil der Mongo-Client in einem anderen Thread läuft und es mir nicht oder etwas zuwirft?java mongodb Treiber Wie fangen Sie Ausnahmen?

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. 
    } 

Das Ergebnis ist

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

Mit dem resultierenden Stack-Trace ein paar verschiedene Ausnahmen enthält, die ich versucht habe, zu fangen, aber meine Catch-Blöcke immer noch nicht alles tun.

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

Ich bin mit dem Java-mongodb Treiber 3.0.4, die meisten Beiträge, die ich sind von einer älteren API mit Hacks wie MongoClient.getDatabaseNames() lesen, die eine MongoException wenn Fehler wirft, außer dies jetzt veraltet ist und mit MongoClient.listDatabaseNames() ersetzt, die ‚doesn t haben den gleichen Fehler Semantik zu werfen.

Gibt es eine Möglichkeit, einfach eine Mongo-Abfrage vom Java-Treiber in einem try catch-Block auszuführen und die Ausnahme tatsächlich gefangen zu bekommen?

+1

@AlexanderKondaurov Können Sie sich diese Antwort ansehen? http://stackoverflow.com/questions/40813060/how-to-catch-exception-when-creating-mongoclient-instance/40814641#40814641. Wenn Sie etwas Bestimmtes suchen, fügen Sie bitte dem Beitrag hinzu. – Veeram

Antwort

0

In der neuen API ist MongoException ein RuntimeException. Sie entweder die allgemeine MongoException oder fangen kann, glaube ich, listDatabaseNames() würde letztlich eine MongoCommandException werfen enden.

+0

Danke, ich habe die aufgeführten Ausnahmen ausprobiert, aber die Ausnahmen werden leider immer noch nicht gefangen. –

+0

haben Sie versucht, MongoSocketOpenException zu erfassen? Das ist die, die du aktiv siehst. Wahrscheinlich weil Mongo nicht wirklich läuft (oder an diesem Port). – evanchooly

+1

Ja, ich habe dieses eine und ungefähr 10 andere ausprobiert, aber keiner von ihnen wird in den Catch-Blöcken gefangen. Soweit ich feststellen kann, wenn der Server heruntergefahren ist, kann ich die einzige Ausnahme finden, die funktioniert, ist die "MongoTimeoutException", die jedoch viele ms ausgelöst wird, die Sie über 'MongoClientOptions.builder(). ServerSelectionTime()' gesetzt haben. Ich gehe vorerst mit diesem Thema. –

0

Sie können System.err in einen ByteArrayOutputStream Puffer umleiten. Wenn eine Laufzeitausnahme ausgelöst wird, wird sie im Puffer gesammelt. Eine Antwort auf ein ähnliches Problem finden Sie unter: https://stackoverflow.com/a/47699292/7388679