Как отловить исключение из внешнего jar в Java
Я пытаюсь запустить алгоритм LDA с помощью библиотеки молотка. Когда я пытаюсь запустить LDA с набором параметров, все в порядке, но с другим набором у меня появляется эта ошибка:
09-Oct-2014 23:50:24.354 INFO [http-nio-8084-exec-127] cc.mallet.topics.ParallelTopicModel.estimate <50> LL/token: -8.73265
09-Oct-2014 23:50:24.657 INFO [http-nio-8084-exec-127] null.null [beta: 0.00795]
09-Oct-2014 23:50:24.657 INFO [http-nio-8084-exec-127] null.null <60> LL/token: -8.6299
09-Oct-2014 23:50:24.957 INFO [http-nio-8084-exec-127] cc.mallet.topics.ParallelTopicModel.estimate <70> LL/token: -8.61982
09-Oct-2014 23:50:25.019 INFO [http-nio-8084-exec-127] null.null [beta: 0.00583]
09-Oct-2014 23:50:25.263 INFO [http-nio-8084-exec-127] cc.mallet.topics.ParallelTopicModel.estimate <80> LL/token: -8.89656
09-Oct-2014 23:50:25.402 INFO [http-nio-8084-exec-127] null.null [beta: 0.00484]
java.lang.ArrayIndexOutOfBoundsException: -1 at
cc.mallet.topics.WorkerRunnable.sampleTopicsForOneDoc(WorkerRunnable.java:489) at
cc.mallet.topics.WorkerRunnable.run(WorkerRunnable.java:275) at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at
java.util.concurrent.FutureTask.run(FutureTask.java:266) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at
java.lang.Thread.run(Thread.java:745) java.lang.ArrayIndexOutOfBoundsException: -1 at
cc.mallet.topics.WorkerRunnable.sampleTopicsForOneDoc(WorkerRunnable.java:489) at
cc.mallet.topics.WorkerRunnable.run(WorkerRunnable.java:275) at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at
java.util.concurrent.FutureTask.run(FutureTask.java:266) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at
java.lang.Thread.run(Thread.java:745)
Мой код выглядит так:
try{
//call some function from library
} catch(Exception e){
System.out.println("LDA Exception")
}
Как можно поймать исключение, вызванное внешними банками? Я задал этот вопрос, но он не работает для меня. Любая идея?
РЕДАКТИРОВАТЬ:
Мой проект - это спокойный веб-сервис, который работает на сервере Apache Tomcat. Я пытаюсь вызвать алгоритм lda в функции dopost.
РЕДАКТИРОВАТЬ 2
Mallet - это библиотека с открытым исходным кодом. Поэтому я попытался прочитать код и нашел код ниже.
public class ParallelTopicModel implements Serializable {
int numThreads = 2;
public void estimate() throws IOException {
WorkerRunnable[] runnables = new WorkerRunnable[numThreads];
for (int thread = 0; thread < numThreads; thread++) {
runnables[thread] = new WorkerRunnable(numTopics, alpha, alphaSum, beta,
random, data, runnableCounts,
runnableTotals, offset, docsPerThread);
//some code
}
}
}
public class WorkerRunnable implements Runnable {
public void run() {
try {
//some code
} catch (Exception e) {
e.printStackTrace();
}
}
}
Мой веб-сервис:
@POST
@Produces("application/xml")
public String getXml(@FormParam("xmlinput") String xmlinput) throws Exception {
try {
//call estimate function in ParallelTopicModel class
//return an xml;
} catch (Exception e) {
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<modelingOutput>null</modelingOutput>";
}
Итак, как можно обрабатывать исключения, которые создают класс WorkRunnable в моем веб-сервисе. Я хочу, чтобы ruturn XML выглядит
`нулевой
Я прочитал много вопросов, подобных этому и этому, но я не нашел решения
1 ответ
Проблема здесь не в том, что звонок на внешний сосуд. Исключения, генерируемые любым методом в вашей цепочке вызовов, независимо от того, где хранится байт-код фактического класса, перехватываются при первом catch
заблокировать цепь.
Проблема, с которой вы столкнулись, заключается в том, что исключение происходит в другом потоке. Если вы запускаете отдельный поток из своего кода, исключения в этом потоке не передаются в ваш поток. Что касается вашего кода, этот вызов завершен. Если код в другом потоке не перехватывает их, они будут перехвачены обработчиком исключений этого потока, если такой обработчик существует.
Ошибки во время выполнения обычно вызваны неправильным вводом, поэтому обычной стратегией, позволяющей избежать их, было бы понять, почему ваши параметры приводят к тому, что индекс массива в этом методе будет отрицательным, а затем убедиться, что вы никогда не передадите такие параметры этому методу.
Если это невозможно, вы можете создать обработчик исключений для потока. Это будет работать, только если вы сами управляете созданием потока и можете установить в нем обработчик.
Вы можете посмотреть на этот вопрос, чтобы узнать больше об обработке исключений в потоках.
Редактировать:
Так как их WorkerRunnable
Кажется, что код перехватывает все исключения (и печатает трассировку стека), нет способа отловить их самостоятельно. Вы можете сделать одну из двух вещей:
- Как я уже говорил выше, проверьте, какие переданные вами параметры вызвали ошибку выхода за пределы массива, и избегайте этих условий. Используйте
if
заявление и если параметры плохие, распечатайте<modelingOutput>null</modelingOutput>
вывод - без запуска моделирования в первую очередь. - Используйте их источник, измените их
catch
предложение для чего-то, что устанавливает переменную, которая сообщает вам, что было исключение, скомпилируйте его и используйте этот jar вместо их. Вот для чего нужен Open Source. Возможно, вы захотите связаться с сопровождающими этой библиотеки и сказать им, что было бы неплохо, если бы они добавили способ определения, вызвано ли исключение одним из подпотоков.