在下面的代码中,当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在什么情况下无法捕获异常?
答案 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块!