Моя «MyException», которая показывает, что тост вызывает проблемы при добавлении в потоки. Как я должен реорганизовать обработку исключений? - PullRequest
2 голосов
/ 04 октября 2010

Я написал свое собственное исключение (MyException) и реализовал ведение журнала и отображение сообщений об ошибках в виде тостов. Вот краткость этого ...

public class MyException extends Exception {

   public MyException(String msg) {
      Looper.prepare();
       Toast.makeText(Controller.getInstance().getApplicationContext(), msg , Toast.LENGTH_LONG).show();
       //Looper.loop();
       Looper.myLooper().quit();
   }
}

Все было хорошо, пока я не реализовал потоки, в которых исключения генерируются и перехватываются.

Вы, наверное, уже видели, что я играл с Looper Class, но, честно говоря, я не знаю, как заставить это работать. Это правильный подход? Вы также можете видеть, что я уже храню ссылку ApplicationContext в моем контроллере. Должен ли я сделать это с ActivityContext, а затем сделать тост из этого ActivityContext? (Но я слышал, что это не очень хорошая практика с точки зрения производительности)

Обновление

Это тот путь, по которому я должен идти, когда исключение ловится в потоке в активности?

private Runnable exceptionCatchingThread   = new Runnable() {
          @Override
          public void run() {
           try { 
                throw new Exception();
           } catch (Exception e) {
              this.e = e;
              runOnUiThread(handleThreadExceptions); }
           }
    }

private Runnable  handleThreadExceptions  = new Runnable() {
             @Override
              public void run() {
               //Show toast or call the general ExceptionHandler, 
               //which is doing logging and stuff
                Helper.handleException(e);
               }
}

1 Ответ

3 голосов
/ 04 октября 2010

Exception должен использоваться для уведомления вызывающего абонента о возникновении проблемы. Вызывающий должен сделать что-то с этим уведомлением, журналом, тостами и т. Д. Вы не должны делать ничего этого в самом классе Exception.

Вы можете создать вспомогательный метод, который будет вызываться, когда вы ловите исключение, которое выполняет тостирование и т. Д. Если вы хотите сделать это из нескольких действий, вы можете создать функцию util, где вы передаете контекст.

public static void displayExceptionMessage(Context context, String msg) {
 Toast.makeText(context, msg , Toast.LENGTH_LONG).show();
}

и в вашей деятельности:

try {
  // something that causes Exception
} catch (MyException e) {
  Helper.displayExceptionMessage(this, e.getMessage());
}
...