java try catch блок не работает с помощью отражения - понятия не имею, почему, возможно, ошибка потока - PullRequest
2 голосов
/ 21 апреля 2011

написание системы в netbeans rcp - не уверен, что это важно, я просто не доверяю rcp

Мы приближаемся к кризису в нашей системе, и продолжает появляться следующая ошибка (иногда это происходит через 10 минут, иногда выполняется в течение 2 дней, а затем происходит, что наводит меня на мысль, что это может быть ошибка многопоточности)

у нас есть класс чтения сокетов, который реализует runnable - вот пример кода

@Override
public void run() {
    while (!Thread.interrupted()) {
        try {
           /*
            * can't display actual code
            * reads data through socket and passes stream to a new handler class 
            * which uses reflection to create new object based off socket stream 
            * (none of this happens in a separate thread)
            * (we're not holding a reference to the handler class - a new one is
            * -created every iteration) 
            *
            * at some point during the creation of this object, we get a socket 
            * closed exception happening at SocketInputStream.socketRead()
            */
        } catch (Exception ex) {
            cleanup();
        }
    }
}

я ожидаю, что исключение сокета должно быть просто перехвачено блоком catch и выполнена очистка

что в итоге происходит вместо этого, я получаю видимую трассировку стека (появляется в окне необработанных исключений netbeans и отображается в консоли) для закрытого сокета java.net.SocketException - я не могу опубликовать трассировку стека из-за требований клиента

Что еще странно, так это то, что в фактическом классе обработчика ввода сокета у нас есть следующий метод (это метод, из которого фактически выдается исключение)

public Abstract________ new________(Class<? extends Abstract________> clazz, 
            DataInput input) {
    ...
    try {
        // reflection code here
    } catch (Exception ex) {
        LOG.error("...");
        throw new RuntimeException(ex);
    }
    ...
} 

если я попытаюсь вручную вызвать исключение java.net.SocketException после блока catch, то исключение будет считываться как java.lang.RuntimeException: java.net.SocketException исключение: сокет закрыт

однако трассировка стека, которую мы получаем случайным образом, просто говорит java.net.SocketException: сокет закрыт

это наводит меня на мысль, что в нашем классе обработки потоков сокетов даже не перехватывается исключение для начала.

Кто-нибудь знает, почему это может происходить ???

также - мне очень жаль, что я не могу опубликовать реальный код, я не пытаюсь быть загадочным

Пока что мне интересно только одно - я немного знаком с рефлексией, но не очень хорошо - когда я выкидываю исключение вручную, оно всегда ловится блоком try catch - если исключение выдается из чего-то в рефлексии есть ли какой-нибудь способ, которым это могло бы нарушить контракт «поймать улов» - я не понимаю, почему это так, но я имею в виду, я честно не уверен и цепляюсь за соломинку в этот момент

я получил разрешение на публикацию отредактированной трассировки стека

enter image description here

в классе MessageReader нет отдельного потока - метод newMessage - это место, где исключение перехватывается, помещается в RuntimeException и генерируется - ____Reader - это средство чтения сокетов с циклом while

оба метода отображаются в трассировке стека

не уверен, поможет ли это

Ответы [ 2 ]

1 голос
/ 21 апреля 2011

Сгенерированная ошибка (java.lang.Error) может обойти ваш блок catch (который только перехватывает исключения).Попробуйте перехватить ошибку и распечатать все необходимые отладочные операторы.Не забудьте сбросить ошибку из блока catch.

Возможно также, что в блоке catch создается исключение.

0 голосов
/ 21 апреля 2011

На ум приходят две возможности:

  • Исключение обнаруживается выше в трассировке стека
  • или трассировка стека фактически не содержит ни одного из методов, которые вы используете.вставил
...