[英]How should you handle MongoDB-Exceptions in Java?
我想处理异常,这些异常是从查询 (find(...).first()) 抛出到 Java 中的 MongoDB(驱动程序 3.7)(数据库未存储在本地)。 但是, JavaDocs和 MongoDB 文档本身中都没有可能指定的异常。 真的可以没有例外吗? 我对此表示怀疑,因为我认为可能会发生一些网络错误。
我的查询看起来像这样:
final MongoCollection<Document> collection = database.getCollection("my-collection");
final Bson bsonFilter = Filters.eq("someName", "test");
final Document result = collection.find(bsonFilter).first();
考虑以下代码。 它连接到本地的 MongoDB 实例,并从名为“users”的数据库中获取名为“test”的集合。
final String connectionStr = "mongodb://localhost/";
MongoClient mongoClient = MongoClients.create("mongodb://localhost/");
MongoDatabase database = mongoClient.getDatabase("users");
MongoCollection<Document> collection = database.getCollection("test");
如果您为connectionStr
值提供了错误的主机名,例如“mongodb://localhostXYZ/”(并且不存在这样的主机),则代码将抛出异常,例如:
com.mongodb.MongoSocketException: localhostXYZ},
caused by {java.net.UnknownHostException: localhostXYZ}}],
..., ...
com.mongodb.MongoSocketException
是 MongoDB Java 驱动程序异常。 这是一个运行时异常。 它也是MongoException
的子类。 来自 MongoDB Java API:
公共类 MongoException 扩展了 RuntimeException
来自驱动程序的所有异常(服务器端或客户端)的顶级异常。
该文档还列出了以下子类(都是运行时异常) MongoChangeStreamException
、 MongoClientException
、 MongoExecutionTimeoutException
、 MongoGridFSException
、 MongoIncompatibleDriverException
、 MongoInternalException
、 MongoInterruptedException
、 MongoServerException
、 MongoSocketException
。
因此,MongoDB Java 驱动程序 API 抛出的所有异常都是运行时异常。 通常,这些并不意味着被捕获和处理(但是,您知道如何使用try-catch
,并且可以捕获和处理运行时异常)。
让我们考虑您的代码:
final MongoCollection<Document> collection = database.getCollection("my-collection");
final Bson bsonFilter = Filters.eq("someName", "test");
final Document result = collection.find(bsonFilter).first();
第一条语句database.getCollection("my-collection"),
当它运行时,代码正在寻找一个名为“my-collection”的集合。
如果要确保集合存在于数据库中,请使用listCollectionNames()
进行验证并检查返回列表中是否存在集合名称。 如果集合名称不存在,您可以抛出异常(如果您愿意)。 这个例外就是你的数字:
因此,代码可能如下所示:
if listCollectionNames() doesn't contain "my-collection"
then
print something and abort the program
-or-
throw a runtime exception
else
continue with program execution
您的代码final Document result = collection.find(bsonFilter).first();
是不正确的。 collection.find
返回FindIterable<TDocument>
而不是Document
。 因此,可以通过进一步检查FindIterable
对象来确定查询输出; 它可能有文件,也可能没有。 而且, find
方法不会抛出任何异常。
根据是否有任何文件返回,您可以向客户显示一条消息。 这不是您抛出异常的情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.