有人能解释一下这段代码发生了什么吗? 没有数据库在运行,因为想法是捕获异常。
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
中答案 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
,但它在连接到数据库时的行为方式相同。