Java中的例外(可恢复与致命)

时间:2013-07-29 21:18:17

标签: java exception

我有一个java程序试图从服务器列表中收集某个rss feed。如果有任何失败,(身份验证,连接等)我想抛出一个异常,它基本上把我带回到我可以捕获它的主循环,在日志中显示一些信息,然后继续尝试下一个服务器在循环。大多数例外似乎都是致命的......即使他们并不真的需要。我相信我已经看到了不是致命的例外......但是不记得肯定。我试图搜索,但我可能使用了错误的术语。

有人可以帮我指出正确的方向吗?是否存在可以恢复的特殊类型的异常,而不是将整个程序停留在轨道上?

4 个答案:

答案 0 :(得分:2)

Exception必须是致命的。 (Errors然而,意味着是致命的。不要抓住它们。)你所要做的就是在某个地方抓住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)

错误:

  

错误“表示合理应用的严重问题   不应该试图抓住。“

例外:

  

异常“表示合理的应用程序可能存在的条件   想赶上。“

异常总是意味着可以恢复,无论是检查还是未检查,尽管可能总是不处理它们,但它应该是。而在 另一方面,错误必定是致命的。然而,即使是错误也可以处理,但它只是花哨的方式说“它崩溃”

可能你想看看Exception vs Error

答案 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");
    }
}

阅读Java tutorial about exceptions