2014-12-19 6 views
1

Android 프로젝트에서 오류 보고서 라이브러리를 사용하고 있습니다. 일단 활성화되면, 검색되지 않은 모든 예외에 반응하고 앱이 종료되기 직전에 보고서가 생성됩니다.앱을 중단하지 않고 예외를 throw

지금까지는 그렇게 좋았지 만이 기능에 "제어"를 추가하고 비 예외에 대한 보고서를 만들고 싶습니다. 내 생각은 "가짜"예외 이런 식으로 정의하는 것입니다 : '비 치명적 오류 메시지를 전송하고 보고서를 생성 할 때, 그래서

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(); 

그러나 당신은 또한 당신의 메인 스레드에서 코드를 실행하고 거기에 그것을 잡을 수 있습니다 :이 작업을 수행 할 수 있습니다

는 메인 스레드에서 예외를 catch 할

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

예외가 RuntimeException 클래스에서 확장되었으므로 예외가 어디에서나 catch되지 않으면 응용 프로그램을 종료하는 것이 기본 동작입니다. 그래서 Java Runtime이 앱을 종료하기로 결정하기 전에이를 파악해야합니다.

+0

이 방법으로는 앱이 종료되지 않지만 충돌 보고서 도구는 활성화되지 않습니다. – TheUnexpected

+0

흥미로운 코드 ~ – Mehdi

+0

@Wessel 나는 그 코드를 하나의 aspect로 만들고 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