我正在创建一个函数,它将执行socket接受并返回3个vales 0 =退出线程发生真正错误的错误 1 =确定与连接通话 =事情发生,做另一个接受(超时)。
我看到IOException有一个GetCause方法返回一个throwable对象。 这个throwable对象有一个get cause方法,它返回一个throwable,它有一个getcuase方法返回一个throwable,好像这会永远持续下去,继续得到另一个throwable对象。
我怎样才能得到异常蚂蚁的原因????? 我可以使用get reason和一堆字符串比较,但这似乎不可靠。 泰德
int GetClient()
{
try {
server.setSoTimeout(5*1);
connection=server.accept();
}
catch(IOException ec)
{
System.out.println(Thread.currentThread()+":"+ec.getMessage());
return 2; // for time out or something where we can try again
// return a zero saying we must stop erra o bad
}
return 1;
}
答案 0 :(得分:1)
accept()
抛出各种异常。 SocketTimeoutException扩展了IOException,但您可以在捕获常规IOException之前“捕获”它。这将允许您返回值,建议您可以再试一次。
这是否涵盖了3种情况,Ok,IOException和Timeout?
答案 1 :(得分:0)
如果您只对超时异常感兴趣,请单独捕获这些异常。大多数IO方法都可能抛出IOException,但IOException有许多不同的子类(它们本身还有其他子类),你可以单独捕获和处理它们。
例如
try {
conn = server.accept();
} catch (SocketTimeoutException e) {
return 2;
} catch (IOException e) {
// socket exception will not be recaught
// even if return statement wasn't used
return 0;
}
return 1;
提供getCause方法,因为创建异常时可以使用字符串消息创建它们,但也可能导致引发此异常的异常。因此,允许异常的捕获者查看导致异常的详细信息。
例如
public double addNumbers(String a, String b) {
try {
double i = Double.parseDouble(a);
double j = Double.parseDouble(b);
return i + j;
} catch (NullPointerException cause) {
throw new IllegalArgumentException(
"Arguments aren't allowed to be null", cause);
} catch (NumberFormatException cause) {
throw new IllegalArgumentException(
"One or more arguments weren't numbers", cause);
}
}
上面的例子有点迟钝,但是它证明了可能会捕获一些异常的原理(也许它可能会尝试从中恢复)然后抛出一个新的异常,并将原始异常作为原因。使用getCause
方法允许调用者立即看到IllegalArgumentException最初是在addNumbers
方法中抛出的(并且这是用户代码库中的问题所在)。但是,通过查看原因,他们将能够看到有关参数的更详细消息是非法的(NumberFormatException
包括尝试解析的字符串)。