方法find和findOne上的casbah异常

时间:2014-01-19 08:53:33

标签: mongodb scala try-catch casbah

有人能解释一下这段代码发生了什么吗? 没有数据库在运行,因为想法是捕获异常。

val col = MongoConnection("localhost")("myDB")("myCol")

// Using Try to catch any exception but there is NO exception
// ex1
val ex1 = Try{col.find()}


// Using Try to catch any exception, now we have an exception
// ex2
val ex2 = Try{col.findOne()}

执行ex2时,异常会被Try try

捕获
ex2: scala.util.Try[Option[a.T]] = Failure(com.mongodb.MongoException$Network: Read operation to server localhost/127.0.0.1:27017 failed on database myDB)

为什么在ex1示例中无法捕获异常(运行该代码后ex1不存在)?

修改

似乎:

val ex1 = Try {col.find().toList}

将异常置于Try into ex1

1 个答案:

答案 0 :(得分:0)

实现连接的方式非常懒惰。

val col = MongoConnection("localhost")("myDB")("myCol")只是创建连接的描述,实际上并不尝试连接到DB,除非你对它执行某些操作。

同样适用于col.find() - 它返回一个尚未评估的游标。换句话说,它不是DB中的开放游标,而是懒惰的Scala游标。一旦你试图通过迭代它来评估它,它将尝试实际运行它并将失败。

这是Casbah的当前行为,它在Mongo对象中使用弃用的def apply(host: String): MongoConnection = new MongoConnection(new com.mongodb.Mongo(host)) Java类:MongoConnection。建议使用MongoClient代替MongoConnection,但它在连接到数据库时的行为方式相同。