我有一个java程序试图从服务器列表中收集某个rss feed。如果有任何失败,(身份验证,连接等)我想抛出一个异常,它基本上把我带回到我可以捕获它的主循环,在日志中显示一些信息,然后继续尝试下一个服务器在循环。大多数例外似乎都是致命的......即使他们并不真的需要。我相信我已经看到了不是致命的例外......但是不记得肯定。我试图搜索,但我可能使用了错误的术语。
有人可以帮我指出正确的方向吗?是否存在可以恢复的特殊类型的异常,而不是将整个程序停留在轨道上?
答案 0 :(得分:2)
否Exception
必须是致命的。 (Error
s然而,意味着是致命的。不要抓住它们。)你所要做的就是在某个地方抓住Exception
,这不是致命的。
try
{
riskyMethod();
}
catch (ReallyScaryApparentlyFatalException e)
{
log(e);
// It's not fatal!
}
答案 1 :(得分:2)
本身没有“不可恢复的例外”。在Java中,如果它注册为“异常”,您可以捕获它:
try {
// Attempt to open a server port
} catch (SecurityException ex) {
// You must not be able to open the port
} catch (Exception ex) {
// Something else terrible happened.
} catch (Throwable th) {
// Something *really* terrible happened.
}
如果要创建连接应用程序的服务器,您可能需要什么,如下所示:
for(Server server : servers) {
try {
// server.connectToTheServer();
// Do stuff with the connection
} catch (Throwable th) {
//Log the error and move along.
}
}
答案 2 :(得分:1)
错误:
错误“表示合理应用的严重问题 不应该试图抓住。“
例外:
异常“表示合理的应用程序可能存在的条件 想赶上。“
异常总是意味着可以恢复,无论是检查还是未检查,尽管可能总是不处理它们,但它应该是。而在 另一方面,错误必定是致命的。然而,即使是错误也可以处理,但它只是花哨的方式说“它崩溃”
答案 3 :(得分:1)
无论你抛出什么类型的异常,它都会在调用堆栈上升,直到它被捕获为止。所以你只需要抓住它:
for (Server server : servers) {
try {
contactServer(server);
}
catch (MyCustomException e) {
System.out.println("problem in contacting this server. Let's continue with the other ones");
}
}