繁体   English   中英

你应该如何处理 Java 中的 MongoDB 异常?

[英]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

来自驱动程序的所有异常(服务器端或客户端)的顶级异常。

该文档还列出了以下子类(都是运行时异常) MongoChangeStreamExceptionMongoClientExceptionMongoExecutionTimeoutExceptionMongoGridFSExceptionMongoIncompatibleDriverExceptionMongoInternalExceptionMongoInterruptedExceptionMongoServerExceptionMongoSocketException

因此,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​()进行验证并检查返回列表中是否存在集合名称。 如果集合名称不存在,您可以抛出异常(如果您愿意)。 这个例外就是你的数字:

  • 如果您想告诉用户或应用程序没有这样的名为“my-collection”的集合,您可以显示或打印一条消息(然后中止程序)使用适当的消息抛出运行​​时异常。

因此,代码可能如下所示:

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.

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