我已经做了类似的事情:
try {
client = new Client(this, "192.168.0.108", 5204);
}catch(ConnectException e) {
e.printStackTrace();
}
IDE说:
ConnectException的无法访问的catch块。这种例外永远不会 从try语句主体抛出
但是当我运行它并强制关闭程序(运行它的GUI窗口)时,它会从该行代码(客户端对象)中生成异常。
我知道-try-块中没有什么可以正式引发Exception的东西,但实际上是从该块引发Exception的。
如何捕获该ConnectException?
堆栈跟踪: https://prnt.sc/q9hzdp
答案 0 :(得分:2)
您的IDE抱怨,因为您要捕获的异常已在Client的构造函数中捕获。
来自Client.java来源:
public Client(PApplet parent, String host, int port) {
...
try {
socket = new Socket(this.host, this.port);
...
} catch (IOException e) {
e.printStackTrace();
...
}
}
ConnectException扩展了IOException,因此处理库已经捕获了该异常。由于该异常不会重新引发,因此不会传播到您的自定义try-catch并使它变得多余。
答案 1 :(得分:0)
对于遇到这个问题的价值,我只是检查了堆栈跟踪的String以查找需要拦截的特定异常,然后我有一个方法来处理它。但是,我不是为“关键任务”应用程序编码的,我只是一个业余程序员。我认为最好的答案是Travieso引用Javassist和GLIB的使用的第二个评论中的第一个答案,但是对于我而言,实现该解决方案的学习曲线太陡了。
以下是我如何处理此问题的示例:
catch (SQLException | IOException | ClassNotFoundException e) {
if (e.toString().contains("InvalidClassException")) {
invalidClassExceptionHandler();
}
else {
e.printStackTrace();
}
}