Правильный способ обработки исключений времени выполнения в Java - PullRequest
2 голосов
/ 14 октября 2010

Я совершенно новичок в этом коде и начал сомневаться в выборе дизайна исходных разработчиков.

У меня есть многопоточное 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;
    }

1 Ответ

2 голосов
/ 14 октября 2010

Существует два способа работы с потоком, который завершается с неконтролируемым исключением. Первый вариант - запустить поток из с помощью блока try-catch, который перехватывает все ошибки и исключения:

Thread t = new MyThread();
try {
  lauchThreadHere(t);
} catch (Throwable e) {
  // log `e` or re-launch thread `t` or do something else.
}

Другой способ - реализовать Thread.UncaughtExceptionHandler:

public class MyUeh implements Thread.UncaughtExceptionHandler {
    public void uncaughtException(Thread t, Throwable e) {
         // log `e` or re-launch thread `t` or do something else.
    }
}

Thread t = new MyThread();
t.setUncaughtExceptionHandler(new MyUeh());
lauchThreadHere(t);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...