Как я могу поймать другое исключение темы - PullRequest
1 голос
/ 10 ноября 2011

Код:

public void doSomethingOrThrowUncheckedException()
{

    Thread worker = new Thread(new Runnable() {
            public void run() {
                try {
                    myObject.doSomething()
                } catch(CheckedException e) {
                    new UncheckedException ();
                }
            }
        });
    worker.start();
}

Объяснение

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

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

Есть ли механизм, который я могу использовать?

Ответы [ 4 ]

3 голосов
/ 10 ноября 2011

Можете ли вы создать Observable вне потока?Если что-то идет не так, поток устанавливает значение, чтобы изменить это Observable.Основной код является Обозревателем и реагирует на изменение, когда вызывается прослушиватель свойства.

2 голосов
/ 10 ноября 2011

Это зависит от того, что вы подразумеваете под звонящим, зная, что что-то пошло не так.Несколько опций сразу приходят на ум.

  • Рабочий поток может установить флаг ошибки.Недостатком является то, что вызывающему потоку нужно будет проверить флаг, чтобы узнать, что что-то пошло не так.(Также может быть флаг для успеха; если ни один из них не установлен, вызывающий поток знает, что работник все еще работает.

  • Рабочий поток может вызвать метод ошибки.недостатком является то, что вызов будет происходить в рабочем потоке. С другой стороны, это обеспечивает место для принятия позитивных мер. Здесь может быть полезен шаблон Observer (хотя я думаю, что реализация Java ужасна).

1 голос
/ 10 ноября 2011

Если после успешного завершения рабочего потока он сообщает об успешном выполнении в Foo или создает объект, который использует Foo, то разверните этот механизм, чтобы он мог передавать проверенное исключение в Foo, а не передавать исключение методувызывающая нить.

public void doSomething()
{
    Thread worker = new Thread(new Runnable() {
            public void run() {
                try {
                    result = myObject.doSomething();
                    foo.processResult(result);
                } catch(CheckedException e) {
                    foo.processException(e);
                }
            }
        });
    worker.start();
}

public void doSomething()
{

    Thread worker = new Thread(new Runnable() {
            public void run() {
                try {
                    result = myObject.doSomething();
                    resultQueue.add(result);
                } catch(CheckedException e) {
                    resultQueue.add(e);
                }
            }
        });
    worker.start();
}

Если doSomething() не взаимодействует с чем-либо после успешного завершения, вам необходимо выполнить один из других ответов.

0 голосов
/ 10 ноября 2011

Вы также можете взглянуть на uncaughtExceptionhandler .

...