2017-02-17 5 views
0

следующий код Scala, кажется, бросить исключение Java, но продолжает выполнение других строк кода:Java исключение не распространяется на Scala

object FirstMain { 
    def main(args: Array[String]): Unit = { 
    var mongoClient : MongoClient = MongoClients.create() // this is a java method 
    println("hello") 
    Thread.sleep(500) 
    println("hello2") 
} 

Консоль вывода:

Feb 17, 2017 7:57:49 PM com.mongodb.diagnostics.logging.JULLogger log 
INFO: Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500} 
Feb 17, 2017 7:57:50 PM com.mongodb.diagnostics.logging.JULLogger log 
INFO: Exception in monitor thread while connecting to server localhost:27017 
com.mongodb.MongoSocketOpenException: Exception opening socket 
at com.mongodb.connection.AsynchronousSocketChannelStream$OpenCompletionHandler.failed(AsynchronousSocketChannelStream.java:253) 

[...] // stacktrace 

java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

[...] // stacktrace 

hello 
hello2 

Я попытался с помощью блок try/catch для обработки исключения, но я получаю тот же результат, что и фрагмент кода кулака. Следующий код никогда не печатает «сделайте что-нибудь!». :

object FirstMain { 
    def main(args: Array[String]): Unit = { 
    try{ 
    var mongoClient : MongoClient = MongoClients.create() 
    } 
    catch { 
    case e : MongoSocketOpenException => println("do Something") 
    } 
    println("hello") 
    Thread.sleep(500) 
    println("hello2") 
    } 
} 

Кто-нибудь знает, как поймать исключение, вызванное асинхронным кодом java в scala?

Заранее за вашу помощь.

+0

Вы должны проверить это http://stackoverflow.com/a/40814641/539864 – xiumeteo

+2

Возможный дубликат [Как поймать исключение при создании экземпляра MongoClient] (http://stackoverflow.com/questions/40813060/how- to-catch-exception-when-creation-mongoclient-instance) – xiumeteo

+0

Определенно дубликат, поскольку проблема связана с интерфейсом scala-java. Должен ли я удалять вопрос тогда? – Antonin

ответ

3

Это не имеет никакого отношения к асинхронному или scala. Метод, который вы вызываете, является синхронным. Он не возвращает Будущий или другой тип асинхронного типа. Клиент, который вы создаете, является асинхронным, но метод не является. Причина, по которой вы не можете поймать исключение, состоит в том, что Mongo, скорее всего, уже преодолевает исключение и не позволяет ему пузыриться.

+0

Спасибо @dress Я вижу, что это исключение не может быть уловлено из моего кода, и что я должен проверить соединение в первый раз, когда я его использую в своем коде, благодаря: [этому связанному вопросу] (http: // stackoverflow.com/questions/40813060/how-to-catch-exception-when-creating-mongoclient-instance) – Antonin