вторник, 12 февраля 2013 г.

Постановка задачиМеханизм обработки ошибок. Создания класса, который позволял бы откладывать обработку ошибок "на потом". То есть вместо вызова e.printStackTrace() в блоке catch я вызываю свой метод и забываю об ошибке.


Данная задача часто возникает как следствие возникновения ошибок при призентации приложения заказчику. В этом случае выгодно чтобы приложение 1) перехватывало все ошибки не падая с ошибкой и сбрасывало сообщение куда-то, для того чтобы разработчику было легше понять что именно свалилось.
2) нужно обрабатывать все ошибки для того чтобы быстрее понять причину возникновения ошибок в приложении, если они возникнут.

Втроую задачу решает приведённый ниже класс. Он записывает в файл последнюю ошибку. При его использовании нужно не забыть включить в манифест разрешение о записи файлов на SD карту а также эмулировать саму SD карту в эмуляторе, если Вы тестируете на эмуляторе.

Для того чтобы решить первую проблему нужно перехватывать непредвиденные ошибке, которые не обязаны перехватываться блоком try catch, например NullPointException.
О том как это делается я расскажу в следующей статье.

Текст класса ErrorHandler:


  1. package com.example;
  2.  
  3. import android.util.Log;
  4. import android.widget.Toast;
  5. import java.io.*;
  6. import java.nio.charset.Charset;
  7.  
  8. /**
  9.  * User: maksym.levitskiy
  10.  * Date: 11.02.13
  11.  */
  12. public class ErrorHandler {
  13.  
  14.     public static final String LOG_FILE_NAME = "log.txt";
  15.  
  16.     public void error(Exception e) {
  17.         addToLog(e);
  18.         trySendToGoogleAnalytic(e);
  19.         trySendToEmail(e);
  20.         if (isPrinterError(e) || isNetworkDisable(e)) {
  21.             sendBroadcastShowedPrinterError();
  22.         }
  23.     }
  24.  
  25.     private void addToLog(Exception exception) {
  26.         try {
  27.             Log.e("Xplat""error:", exception);
  28.             saveExceptionMessageToFile(exception);
  29.         catch (Exception e) {
  30.             e.printStackTrace();
  31.         }
  32.     }
  33.  
  34.     private void saveExceptionMessageToFile(Exception exception) {
  35.         try {
  36.             File file = new File(MyApplication.instance.getExternalCacheDir(), LOG_FILE_NAME);
  37.             OutputStream fo = new FileOutputStream(file);
  38.             String str = buildExceptionMessage(exception);
  39.             fo.write(str.getBytes(Charset.forName("UTF-8")));
  40.         catch (NullPointerException ex) {
  41.             Toast.makeText(MyApplication.instance, "Нету SD карты", Toast.LENGTH_SHORT).show();
  42.         catch (Exception e) {
  43.             e.printStackTrace();
  44.         }
  45.     }
  46.  
  47.     private String buildExceptionMessage(Exception exception) {
  48.         StringWriter stackTrace = new StringWriter();
  49.         exception.printStackTrace(new PrintWriter(stackTrace));
  50.         return stackTrace.toString();
  51.     }
  52.  
  53.     private void trySendToGoogleAnalytic(Exception e) {
  54.  
  55.     }
  56.  
  57.     private void trySendToEmail(Exception e) {
  58.  
  59.     }
  60.  
  61.     private boolean isPrinterError(Exception e) {
  62.         return true;
  63.     }
  64.  
  65.     private boolean isNetworkDisable(Exception e) {
  66.         return true;
  67.     }
  68.  
  69.     private void sendBroadcastShowedPrinterError() {
  70.  
  71.     }
  72. }


Комментариев нет:

Отправить комментарий