1

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

有人可以帮我指出正确的方向吗?与停止整个程序在其轨道上相比,我可以抛出哪些特定类型的异常可以恢复?

4

4 回答 4

2

错误:

错误“表明合理的应用程序不应试图捕获的严重问题”。

例外:

异常“表示合理的应用程序可能想要捕获的条件”。

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

可能你想看看异常错误

于 2013-07-29T21:21:20.383 回答
2

不需要Exception是致命的。(然而, Errors是致命的。不要抓住它们。)你所要做的就是抓住Exception某个地方,这不是致命的。

try
{
    riskyMethod();
}
catch (ReallyScaryApparentlyFatalException e)
{
    log(e);
    // It's not fatal!
}
于 2013-07-29T21:23:34.727 回答
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.
  }
}
于 2013-07-29T21:27:18.523 回答
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 教程

于 2013-07-29T21:24:36.343 回答