Я совершенно новичок в этом коде и начал сомневаться в выборе дизайна исходных разработчиков.
У меня есть многопоточное 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) Улов для бросаемого объекта.Я понимаю, что они хотят захватить проверенные исключения и непроверенные исключения.Я предполагаю, что они также хотят проверять наличие ошибок, но документация 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;
}