2014-12-19 1 views
1

Я использую библиотеку отчетов об авариях в своем проекте Android. После активации он реагирует на каждое исключенное исключение и создает отчет непосредственно перед отключением приложения.Бросьте исключение без сбоев приложения

Пока все хорошо, но я хочу добавить еще «контроль» к этой вещи и создать отчеты для исключений. Моя идея заключается в том, чтобы определить «фальшивый» исключение так:

public final class NonFatalError extends RuntimeException { 

    private static final long serialVersionUID = -6259026017799110412L; 

    public NonFatalError(String msg) { 
     super(msg); 
    } 
} 

Так что, когда я хочу, чтобы отправить сообщение об ошибке не критично, и создать отчет, я сделаю это:

throw new NonFatalError("Warning! A strange thing happened. I report this to the server but I let you continue the job..."); 

Если вызвано из основного потока, это, очевидно, приводит к сбою приложения. Итак, я попытался выбросить его на фоне нитки!

new Thread(new Runnable() {  
    @Override 
    public void run() { 
     throw new NotFatalError("Warning! A strange thing happened. I report this to the server but I let you continue the job..."); 
    } 
}).start(); 

Отличная идея? Нет. В любом случае приложение вылетает (но фальшивый отчет о сбое отправляется, как ожидалось). Есть ли другой способ добиться того, чего я хочу?

+1

// Есть ли другой способ достичь того, что я хочу? // Нет, вам нужно поймать исключение, чтобы остановить его сбой приложения. – samthebest

ответ

2

Ваше исключение никогда не попадает в ловушку, поэтому ваше приложение рушится.

Вы можете сделать это сделать поймать исключение из вашего основного потока:

Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() { 
    public void uncaughtException(Thread th, Throwable ex) { 
     System.out.println("Uncaught exception: " + ex); 
    } 
}; 

Thread t = new Thread(new Runnable() {  
    @Override 
    public void run() { 
     throw new NotFatalError("Warning! A strange thing happened. I report this to the server but I let you continue the job..."); 
    } 
}); 

t.setUncaughtExceptionHandler(h); 
t.start(); 

Но вы также можете запустить код из основного потока и поймать его там .. Как:

try 
{ 
    throw new NonFatalError("Warning! blablabla..."); 
} 
catch(NonFatalError e) 
{ 
    System.out.println(e.getMessage()); 
} 

Поскольку ваше исключение расширено от класса RuntimeException, поведение по умолчанию заключается в выходе из приложения, если исключение нигде не зацепилось. Вот почему вы должны поймать его, прежде чем Java Runtime решит выйти из приложения.

+0

Этот метод не убьет приложение, но также не активирует инструмент отчета о сбое. – TheUnexpected

+0

интересный код ~ – Mehdi

+0

@Wessel Я думаю о том, чтобы сделать этот код одним из аспектов и закодировать его в annotaion ~ – Mehdi

0

Вы используете исключение для создания журналов. Вы не должны этого делать. Если вы используете библиотеку, например crashlytics (https://try.crashlytics.com/), вы можете отправлять отчеты журналов, как в этой ссылке: http://support.crashlytics.com/knowledgebase/articles/120066-how-do-i-use-logging

Библиотека, которую вы используете, должна иметь аналогичный метод.

Если вы хотите продолжать использовать Исключения, вам нужно поймать их, чтобы не сбой приложения.

+1

Я знаю, что Crashlytics и я ранее работали с ним. Теперь нам нужно было изменить некоторую базу кода, и мы перешли на новую библиотеку Parse CrashReport (http://blog.parse.com/2014/12/09/introducing-parse-crash-reporting-2/) Это намного проще, чем Craslytics и не содержит такой функции. – TheUnexpected