2011-12-20 3 views
0

소켓을 수락하고 3 개의 값을 반환하는 함수를 작성 중입니다. 0 = 정말 나쁜 오류는 종료 스레드가 발생합니다. 1 = 연결과 대화합니다. = 뭔가 일이 일어나고 다른 수락을합니다 (시간 초과).소켓 수락으로 인해 예외가 발생하는 경우 그 이유를 어떻게 알 수 있습니까?

IOException에 throwable 객체를 반환하는 GetCause 메소드가 있음을 알 수 있습니다. 이 throwable 객체에는 throwable을 반환하는 get cause 메서드가 있습니다.이 메서드는 throwable을 반환하는 getcuase 메서드가있어 영원히 계속되는 것처럼 보이며 다른 throwable 개체를 계속 가져옵니다.

어떻게하면 예외적 인 이유를 알 수 있습니까? 나는 이유를 얻고 많은 문자열을 비교할 수 있지만 이것은 신뢰할만한 것으로 보이지 않습니다. 테드

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

타임 아웃 예외에만 관심이있는 경우 해당 예외를 개별적으로 catch하십시오. 대부분의 입출력 메소드는 잠재적으로 IOException을 던질 수 있지만 개별적으로 catch하고 처리 할 수있는 많은 다른 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 메소드를 사용하면 호출자는 원래 addNumbers 메소드에서 IllegalArgumentException이 던져 졌음을 즉시 알 수 있습니다 (그리고 이것이 사용자 코드베이스의 문제점입니다). 그러나 원인을 살펴보면 인수에 대한 자세한 메시지가 불법임을 알 수 있습니다 (NumberFormatException에는 구문 분석하려는 문자열이 포함됨).

1
accept() 

예외의 다양한 발생합니다. SocketTimeoutException은 IOException을 확장하지만 일반적인 IOException을 잡기 전에 'catch'할 수 있습니다. 이렇게하면 다시 시도 할 수있는 값을 반환 할 수 있습니다.

이 경우에는 Ok, IOException 및 Timeout?

관련 문제