Scala中的Scala Try / Catch块无法捕获异常

时间:2016-07-13 11:52:54

标签: scala exception

在下面的代码中,当try块内的第一行抛出ConnectException时,它不会被捕获。我正在重新抛出异常,因为原始异常消息“Connection Refused”对调试没有用,所以我要添加更多信息。但是,从未显示“无法连接...”消息的异常。我只看到原始的“拒绝连接”异常消息。

private[this] def getClient(system: ActorSystem, config: Config): ConfigException Xor Conn =
  for {
    natsConfig <- config.configAt("messaging.nats")
    userName   <- natsConfig.readString("user")
    password   <- natsConfig.readString("password")
    host       <- natsConfig.readString("host")
    port       <- natsConfig.readString("port")
  } yield {
    val props = new Properties()
    props.put("servers", "nats://" + userName + ":" + password + "@" + host + ":" + port)
    log.debug("NATS connection properties:" + props.getProperty("servers"))
    try {
      val client = Conn.connect(props)
      system.registerOnTermination {
        client.close()
      }
      client
    } catch {
      case ex:ConnectException =>
        throw new ConnectException("Failed to connect to nats using props:" + props.getProperty("servers"))
    }
  }

我得到的输出是:

  

I | 16:25:15.561 | o.g.s.messaging.MessageBusManager $ |启动NATS   java.net.ConnectException:连接被拒绝       在sun.nio.ch.Net.connect0(本机方法)       at sun.nio.ch.Net.connect(Net.java:454)       at sun.nio.ch.Net.connect(Net.java:446)       at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:648)       在java.nio.channels.SocketChannel.open(SocketChannel.java:189)       在org.nats.Connection.connect(Connection.java:211)       at org.nats.Connection。(Connection.java:164)       在org.nats.Conn。(Conn.scala:5)       at org.nats.Conn $ .connect(Conn.scala:68)       在org.genivi.sota.messaging.nats.NatsClient $$ anonfun $ getClient $ 1 $$ anonfun $ apply $ 3 $$ anonfun $ apply $ 4 $$ anonfun $ apply $ 5 $$ anonfun $ apply $ 6.apply(NatsClient.scala:30 )

请注意异常消息,该消息与catch块中的异常消息不匹配。 NatsClient:30是catch块的第一行

上面的代码尝试使用scala_nats连接到NATS消息服务器。即使我将catch案例更改为Throwable,仍然没有捕获异常。但是,如果我在try的第一行中抛出ConnectException,则会捕获该异常。我还尝试将 root 添加到我的导入中以确保没有命名空间冲突,但无济于事。

Scala在什么情况下无法捕获异常?

2 个答案:

答案 0 :(得分:2)

Java_Nats库中Connection.java的相关代码段:

JavaWindow.this

根据您的堆栈跟踪, $i = 0; foreach ($apiResponse['response']['data']['data'] as $data) { echo "<tr>"; echo "<td align='center'>" . $data['Offer']['name'] . "</td>"; echo "<td align='center'>" . $data['Stat']['affiliate_id'] . "<input type='hidden' name='info[".$i."]['id']' value='" . $data['Stat']['affiliate_id'] . "'></td>"; echo "<td align='center'>" . $data['Stat']['conversions'] . "</td>"; echo "<td align='center'>" . number_format(@($data['Stat']['payout']/$data['Stat']['conversions']),2,'.','.') . "<input type='hidden' value='" . number_format(@($data['Stat']['payout']/$data['Stat']['conversions']),2,'.','.') . "' name='info[".$i."]['payout']'></td>"; echo "<td align='center'>" . number_format(@($data['Stat']['revenue']/$data['Stat']['conversions']),2,'.','.') . "<input type='hidden' value='" . number_format(@($data['Stat']['revenue']/$data['Stat']['conversions']),2,'.','.') . "' name='info[".$i."]['revenue']'></td>"; echo "<td align='center'><input size='2 type='text' name='invalidar_" . $i++ . "'></tr>"; } 失败。然后捕获,记录和吞下异常,以便它不会到达您的处理程序。

N.b。上面的代码来自库的0.5.1版本。最新的(0.6.0)更新并抛出IOException,没有记录。

<小时/> (我原来的答案完全取消了:)

  

异常被捕获,但你立即抛出另一个异常。我认为   您打算将异常对象作为private boolean connect() throws IOException { try { InetSocketAddress addr = new InetSocketAddress(servers[current].host, servers[current].port); channel = SocketChannel.open(addr); while(!channel.isConnected()){} servers[current].connected = true; } catch(Exception ie) { ie.printStackTrace(); return false; } return true; } 返回(而不是抛出)   代替。 (至少这是声明的返回类型   SocketChannel.open()建议。)   

答案 1 :(得分:2)

} catch { case ex:ConnectException => println("HELLO!!!") 被抓住了这一行:

ConnectException

但你立刻又投了composer.json

一般来说,你不应该用另一个例外来包装异常。

从我在这里看到的,根本不使用try块!