如果套接字接受导致异常,我该如何找出原因?

时间:2011-12-20 01:01:11

标签: java tcp

我正在创建一个函数,它将执行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;
}

2 个答案:

答案 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包括尝试解析的字符串)。