2015-05-28 2 views
1

Когда возникает исключение, и я получаю Throwable, я хочу преобразовать его в MyThrowable и повторно отправить его.Java - Как я могу преобразовать throwable в новый throwable и бросить его?

Я реализую метод по созданию экземпляра

obs1 = obs1.map(new Func1<Integer, Integer>() { 
      public Integer call(Integer integer) { 
      try { 
        getObj().equals(""); // an exception occurs 
        return ++integer; 
       } catch (Throwable t) { 
//     t = new MyThroawable("",""); // if this is unmarked - failes to compile 
        throw t; 
       } 
      } 
     }); 
  • мне нужно иметь дело с Throwable, потому что мои реактивные ФВ (rxJava) возвращают метательные об ошибке

ошибке компиляции я получаю когда примечание перемещено из нового Создания сбрасывания

java: unreported exception async.job.MyThroawable; must be caught or declared to be thrown 
+0

Что точное сообщение об ошибке? –

+0

Редактировал с сообщением – Jeb

ответ

0

У вас не может быть двух операторов броска один за другим.

Просто бросить свой собственный исключение:

 public Integer call(Integer integer) throws MyThroawable 
    { 
     try { 
      getObj().equals(""); // an exception occurs 
      return ++integer; 
     } catch (Throwable t) { 
      throw new MyThroawable("",""); 
     } 
    } 

Вы могли бы хотеть, чтобы передать оригинальный Throwable t конструктору вашего пользовательских исключений в.

Кроме того, если MyThrowable является проверенным исключением, вы должны добавить предложение throws к вашему методу public Integer call(Integer integer).

+0

Спасибо. Я написал другой бросок, чтобы показать, что он компилируется. когда я пытаюсь изменить t, это не так. – Jeb

+0

Редактировал для уточнения – Jeb

+0

@rails see edit – Eran

0

Я полагаю, что годность Throwable распространяется на Throwable :). Один из конструкторов класса Throwable (который должен также иметь ваш класс) - это тот, который получает другое исключение Throwable. Итак, вы только что сделали:

throw new MyThrowable (t);

2

Вы должны использовать исключения цепочки:

} catch (Throwable t) { 
    throw new MyThroawable("Something failed", t); 
} 

Вы должны также include useful information in your message, который поможет определить, что пошло не так (как объект, на котором вы работали).

Java: незарегистрированное async.job.MyThroawable исключения

Java не позволяют бросить проверенные исключения, не объявляя их. Это old debate.

Исправление состоит в том, чтобы добавить метод throws MyThroawable (а затем исправить сотни ошибок компиляции, которые вы получите в другом месте) или сделать MyThroawable extend RuntimeException (рекомендуется).

0

Ваша проблема заключается в том, что каждый Throwable, что метод может выбросить (за RuntimeExceptions исключением должны быть объявлены в объявлении метода с использованием throws ключевого слова. Таким образом, идеальным способом было бы изменить

public Integer call(Integer integer) { ... 

в

public Integer call(Integer integer) throws MyThrowable { ... 

Однако, поскольку этот метод не определен в Func1, вы получите сообщение об ошибке overridden method does not throw Exception. Таким образом, лучше всего использовать закрытие, т.е., объявите некоторую переменную за пределами вашей функции call, сохраните там исключение и переверните ее за пределы вызова до map. Это будет выглядеть примерно так:

Throwable t = null; 

obs1 = obs1.map(new Func1<Integer, Integer>() { 
    public Integer call(Integer integer) { 
    try { ... } 
    catch (Throwable t) { outerThrowable = t; } 
    } 
}); 

if(t != null) { 
    throw new MyThroawable("", ""); 
} 

Только не забудьте объявить throws MyThrowable в окружающем метод, в противном случае вы получите ту же ошибку там.


Edit: Как Аарон отметил, что также возможно, чтобы продлить MyThrowableRuntimeException вместо Throwable. В этом случае вы можете просто перебросить их непосредственно в функцию map. Однако вам придется документировать это где-нибудь, чтобы не удивлять вызывающих вас методов, если он неожиданно вызывает исключение. Это большой выбор дизайна, поэтому вам нужно решить.

0

Как вы используете RxJava, вы можете использовать исключение RxJava которые держат значение, которое бросить исключение:

throw OnErrorThrowable.addValueAsLastCause(e, file); 

Так что в вашем коде:

obs1 = obs1.map(new Func1<Integer, Integer>() { 
     public Integer call(Integer integer) { 
     try { 
       getObj().equals(""); // an exception occurs 
       return ++integer; 
      } catch (Throwable t) { 
       throw OnErrorThrowable.addValueAsLastCause(t, integer); 
      } 
     } 
    }); 
4

Как правило, следует избегать исключая исключения из экземпляров FuncX и ActionX, и вы не можете напрямую передавать проверенные исключения.

Однако, если вы хотите карту над API, который бросает проверяемое исключение, вы можете использовать flatMap где вы либо вернуть регулярное значение наблюдаемого или ошибки наблюдаемые:

source.flatMap(integer -> { 
    try { 
     getObj().equals("") 
     return Observable.just(++integer); 
    } catch (Throwable t) { 
     return Observable.error(OnErrorThrowable.addValueAsLastCause(t, integer)); 
    } 
}) 
Смежные вопросы