2012-07-03 6 views
4

Я работаю над приложением для Android, которое использует сокеты. У меня есть функция, называемая initializeStreams(), которая открывает сокет и пытается установить соединение. Эта функция генерирует исключение ConnectException, если соединение невозможно установить. Но по какой-то причине в коде, вызывающем initializeStreams(), который имеет блок catch для ConnectException, журнал печатает свою собственную трассировку стека для исключения вместо перехода в блок catch. Блок catch никогда не достигается вообще, хотя точное исключение бросается. Вот код:У меня есть исключение ConnectException, которое почему-то не поймано

Пробный блок:

try { 
     initializeStreams(); 

      /* other code */ 

    } catch (ConnectException e) { 
     Log.i(TAG, "caught connect exception"); 

    } 

initializeStreams():

public void initializeStreams() throws ConnectException { 
    try { 
     Log.i(TAG, "Attempting to connect"); 

     requestSocket = new Socket(SERVER_ADDR, PORT); 

        /* other code */ 


    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Я не могу понять это, так что любая помощь будет оценена.

+0

Мы не можем понять, почему это происходит, поскольку единственная операция сокета, которую вы опубликовали в своем коде, не вызывает исключение ConnectException. Оставьте остальную часть кода. – Th0rndike

+0

Yea. Log перед началом инициализации сокета печатается, тогда трассировка стека ConnectException печатается, а не Log, который находится в блоке catch. initializeStreams() - единственная функция, которая вызывает ConnectException, и первый фрагмент кода - это единственное место, где он вызывается. – aakbari1024

+0

Что вы имеете в виду? Эта операция сокета является той, которая генерирует исключение, она говорит это в трассировке стека, и это единственная операция сокета в моей программе на данный момент. – aakbari1024

ответ

2

Вам необходимо связать свое исключение, выбросив его в блок catch. Попробуйте следующее:

public void initializeStreams() throws ConnectException { 
try { 
    Log.i(TAG, "Attempting to connect"); 

    requestSocket = new Socket(SERVER_ADDR, PORT); 

       /* other code */ 


} catch(ConnectException e){ 
    throw e; 
} 

catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

это исправлено, спасибо! – aakbari1024

+0

Странно, потому что он даже не компилируется в форме предварительного редактирования. Измененная версия initializeStreams() содержит бесполезную последовательность catch/throw, которая была бы лучше исключена полностью. – EJP

+0

@ EJP да, вы правы. У отредактированной версии есть бесполезный блок try/catch. Я исправил свой пост. Спасибо, что указали на эту ошибку. –

2

ConnectException расширяет SocketException в свою очередь, расширяет IOException, поэтому улов для IOException в initializeStreams() уловах ConnectException. я бы просто удалить этот try/catch блок в целом: там не так много смысла возвращаться чисто из этого метода без подключение.

Смежные вопросы