简体   繁体   中英

How should you handle MongoDB-Exceptions in Java?

I want to handle exceptions, which are thrown from a query (find(...).first()) to MongoDB (Driver 3.7) in Java (the database is not stored locally). However there are no possible exceptions named in the JavaDocs and also in the MongoDB documentaton itself. Can there really occur no exceptions? I doubt that, because I think there could occur eg some network errors.

My queries look something like this:

final MongoCollection<Document> collection = database.getCollection("my-collection");
final Bson bsonFilter = Filters.eq("someName", "test");
final Document result = collection.find(bsonFilter).first();

Consider the following code. It connects to a MongoDB instance locally and gets a collection named "test" from the database named "users".

final String connectionStr = "mongodb://localhost/";
MongoClient mongoClient = MongoClients.create("mongodb://localhost/");
MongoDatabase database = mongoClient.getDatabase("users");
MongoCollection<Document> collection = database.getCollection("test");

If you provide a wrong host name for the connectionStr value, like "mongodb://localhostXYZ/" (and no such host exists) the code will throw an exception, like:

com.mongodb.MongoSocketException: localhostXYZ}, 
caused by {java.net.UnknownHostException: localhostXYZ}}],
..., ...

com.mongodb.MongoSocketException is a MongoDB Java driver exception. It is a runtime exception. It is also a sub-class of MongoException . From the MongoDB Java API:

public class MongoException extends RuntimeException

Top level Exception for all Exceptions, server-side or client-side, that come from the driver.

The documentation also lists the following are sub-classes (all are runtime exceptions) MongoChangeStreamException , MongoClientException , MongoExecutionTimeoutException , MongoGridFSException , MongoIncompatibleDriverException , MongoInternalException , MongoInterruptedException , MongoServerException , MongoSocketException .

So, all the exceptions thrown by MongoDB Java driver APIs are runtime exceptions. These are, in general, not meant to be caught and handled (but, you know how to use try-catch , and a runtime exception can be caught and handled).


Let us consider your code:

final MongoCollection<Document> collection = database.getCollection("my-collection");
final Bson bsonFilter = Filters.eq("someName", "test");
final Document result = collection.find(bsonFilter).first();

The first statement database.getCollection("my-collection"), when it runs the code is looking for a collection named "my-collection".

If you want to make sure the collection exists in the database, then verify using the listCollectionNames​() and check the collection name exists in the returned list. In case the collection name doesn't exist, you can throw an exception (if you want to). This exception is what you have figure:

  • if you want to tell the user or the application that there was no such collection named "my-collection", you can show or print a message saying so (and then abort the program) or throw a runtime exception with an appropriate message.

So, the code might look like this:

if listCollectionNames​() doesn't contain "my-collection"
then 
    print something and abort the program
    -or-
    throw a runtime exception
else
     continue with program execution

Your code final Document result = collection.find(bsonFilter).first(); is not correct. collection.find returns a FindIterable<TDocument> not a Document . So, the query output can be determined by further examining the FindIterable object; it may have documents or none. And, the find method doesn't throw any exceptions.

Based on if there are any documents returned or not you can show a message to the client. This is not a case you throw an exception.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM