2010-10-14 3 views
2

Я совершенно новичок в этом коде и начал задавать вопросы о дизайне оригинальных разработчиков.Правильный способ обработки исключений 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; 
    } 
+0

Есть много потоков на этом/аналогичную тему , У вашего исключения есть этот метод - e.shouldProcessFurther() - Как правило, следует оставить обработчику решение о продолжении или прервании или любом другом подходящем действии. Исключение с возможностью установки и получения серьезности, код ошибки и т. Д. Могут быть полезны для случая пользователя. – Jayan

ответ

2

Существует два способа борьбы с потоком, который выходит с неконтролируемым исключением. Первый вариант, чтобы запустить нить с в 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); 
Смежные вопросы