我有一个实例方法,在其中,我做了一个简单的网页解析:
public void doOperation(final AuthorAccess authorAccess, ArgumentsMap arguments) throws IllegalArgumentException,AuthorOperationException
{
final String server = "chiexist1.worldbook.com";
final String port = "8080";
try {
docBuilder = docFactory.newDocumentBuilder();
doc = docBuilder.parse("http://" + server + ":" + port + "/exist/webdav/db/portfolio/config/products.xml");
...}
catch{}
}
因为目前我正在对字符串中的服务器地址进行硬编码,所以可能存在服务器名称不正确的情况,因此在这种情况下,我希望它自动将服务器URL字符串更改为“localhost”。
我认为if-else语句可能会起作用,但我不太确定如何确定布尔变量以检测此解析是否失败。我还想把它放在catch语句中,但是其他语句也会抛出异常呢?
我还检查了DocumentBuilder的API,parse()方法总是返回Document Type但不返回boolean。所以如果有人能在这里给我一些关于如何检测被冤枉的URL然后改为解析localhost的建议,我将不胜感激,提前感谢。
答案 0 :(得分:3)
我认为你可以在这里找到答案:Validating URL in Java
答案 1 :(得分:2)
以下代码应该做你喜欢的。基本上,在catch
中只需从localhost构建另一个doc。
final String server = "chiexist1.worldbook.com";
final String port = "8080";
docBuilder = docFactory.newDocumentBuilder();
doc = null;
try {
doc = docBuilder.parse("http://" + server + ":" + port + "/exist/webdav/db/portfolio/config/products.xml");
} catch{
try{
doc = docBuilder.parse("http://" + "localhost" + ":" + port + "/exist/webdav/db/portfolio/config/products.xml");
} catch {
// now we have an error we can't recover from
}
}
... // I meant to do this before.
答案 2 :(得分:1)
一般提示:不要只写“捕获”。始终指定要捕获的异常类型(最好是您自己的自定义异常类型),以便您知道代码完全符合您的意思。否则,如你所说,catch语句可能会捕获一些你不想发生的其他类型的异常,实际上应该向上抛出。
答案 3 :(得分:0)
跟踪变量和循环中的尝试次数,直到成功或最大尝试次数(我选择5)通过:
String server = "chiexist1.worldbook.com";
final String port = "8080";
int attempts = 0;
final int MAX_ATTEMPTS = 5;
boolean success = false;
docBuilder = docFactory.newDocumentBuilder();
while (!success && attempts < MAX_ATTEMPTS) {
try {
doc = docBuilder.parse("http://" + server + ":" + port + "/exist/webdav/db/portfolio/config/products.xml");
success = true;
} catch (IOException e) {
if (++attempts < MAX_ATTEMPTS) {
System.err.println("Attempt to connect to " + server + ":" + port + " failed. Retrying" + (attempts == 1 ? ", but connecting to localhost:" + port + " this time" : "") + ".");
server = "localhost";
} else {
System.err.println("Attempt to connect to " + server + ":" + port + " failed. Giving up after " + attempts + " failed attempts.");
}
}
}
if (!success) {
// Tidy up and exit
}
// Do stuff
答案 4 :(得分:0)
您应该单独捕获相应的异常,并根据捕获的异常执行不同的错误处理逻辑。这被认为是最好的方法,因为它将错误条件与正常逻辑分开,你可以用不同的方式处理不同的错误。
在正常的逻辑流程中,它被认为比if else语句更好。
答案 5 :(得分:0)
尝试这样的事情:
static String hostname = "hostname";
static{
if(doesHostExist(hostName)==false){
hostname="localhost";
}
}
private static boolean doesHostExist(String host){
try {
URL url = new URL("http://" + host);
URLConnection conn = url.openConnection();
conn.connect();
return true;
} catch (MalformedURLException e) {
return false;
} catch (IOException e) {
return false;
}
}
*编辑从上一个答案中提取的其他代码:Validating URL in Java