Я совершенно новичок в этом коде и начал задавать вопросы о дизайне оригинальных разработчиков.Правильный способ обработки исключений Runtime в Java
У меня многопоточное приложение Java, которое обрабатывает ряд задач. Моя задача - исправить обработку исключений в коде, чтобы при возникновении RuntimeException (iBatis и/или NullPointerException) остальные задачи выполнялись вместо завершения потока. Я хочу знать, что это лучший способ справиться с обработкой под исключение:
public List<WorkUnit> performModule(List<WorkUnit> listOfInputs)
throws ModuleException {
List<WorkUnit> listOfOutputs = new ArrayList<WorkUnit>();
for (WorkUnit mi : listOfInputs) {
WorkUnit mo=null;
try {
if (mi instanceof BulkOrder) {
mo = performModuleOperation(...);
} else if (mi instanceof Order) {
mo = performModuleOperation(...);
} else if (mi instanceof PreReleaseLoad) {
mo = performModuleOperation(...);
} else if (mi instanceof Load) {
mo = performModuleOperation(...);
}
listOfOutputs.add(mo);
} catch (OMSException e) {
if (e.shouldProcessFurther()) {
listOfOutputs.add((mo!=null) ? mo : mi);
}
//save error to database - code was removed
if (e.getExceptionType().equals(ExceptionType.TECHNICAL)) {
if (e instanceof ModuleException) {
throw (ModuleException) e;
} else {
throw new ModuleException(e);
}
}
} catch (Throwable th) {
ModuleException me = new ModuleException(th);
ExceptionHandler.logException(me, (WorkUnit)mi,orderDelegate);
throw me;
}
}
return listOfOutputs ;
}
У меня есть две основные проблемы. 1) Улов для объекта Throwable. Я понимаю, что они хотят захватить проверенные исключения и исключенные исключения. Я предполагаю, что они хотят также проверить ошибки, но в документации Sun для обработки исключений указано, что это настоятельно рекомендуется. Если у вас действительно серьезная ошибка, так как у JVM закончилась нехватка памяти, вы не сможете ее восстановить. Это можно поймать в файле журнала, и я не согласен с тем, что с ним нужно иметь дело. Лично, если вы отслеживаете ошибки в технических и прикладных исключениях, это не похоже на то, что вы могли бы отслеживать, как и любое другое исключение. Я мог ошибаться ...
2) Непонятно, как обрабатываются исключения. В приведенном ниже коде, который исключение выбрасывает вышеописанный код, он обертывает регулярное исключение, если оно проверено или не отмечено в настраиваемом исключении и выбрасывает его. В приведенном выше коде рассматривается OMSException, которое является родительским элементом каждого пользовательского исключения во всем приложении. Это хороший дизайн? Вы можете увидеть, где они включают ExceptionType в настраиваемый объект исключения. Уже существует функциональность, встроенная в существующую обработку исключений Java. Если это исключение для приложения, то создайте специальное исключение. Если это техническое исключение, что-то является нулевым, если оно не должно быть или проблема с соединением с базой данных, а затем выхватите непроверенное исключение из Java и соответствующим образом отреагируйте. Все это кажется запутанным. Я просто хочу знать, какие мысли есть у других.
public Order performModuleOperation(Order order)
throws ModuleException {
try {
Map<String, Rule> rules = ...
}
catch (InductException ie) {
throw ie;
}
catch (Exception e) {
e.printStackTrace();
throw new InductException(e.toString(),e);
}
return order;
}
Есть много потоков на этом/аналогичную тему , У вашего исключения есть этот метод - e.shouldProcessFurther() - Как правило, следует оставить обработчику решение о продолжении или прервании или любом другом подходящем действии. Исключение с возможностью установки и получения серьезности, код ошибки и т. Д. Могут быть полезны для случая пользователя. – Jayan