2011-08-30 11 views
41

Istnieje metoda drukowania wyjątkowego błędu, więc chciałbym wziąć cały wyjątek w String i pokazać go przez Toast.makeText()
Jak mogę to zrobić?
Jeśli istnieje więcej alternatywnych pomysłów, podziel się ze mną lub zaproponuj mi.e.printStackTrace(); w łańcuchu

+0

Jaki jest twój cel w nagrodę? Czy potrzebujesz więcej informacji niż podano w zaakceptowanej odpowiedzi, czy chcesz alternatywne odpowiedzi (w którym kierunku?), Czy chcesz po prostu dać dodatkową nagrodę za istniejącą odpowiedź? Niektóre komentarze na ten temat będą miłe, więc możliwe, że odpowiedzą teraz na to, co chcesz w odpowiedzi. –

+0

Potrzebuję więcej informacji na ten temat –

Odpowiedz

97

Poniższa część kodu:

Writer writer = new StringWriter(); 
exception.printStackTrace(new PrintWriter(writer)); 
String s = writer.toString(); 

znajdowały się sposobem wyodrębnić StackTrace wyjątku w łańcuchu w jednej linii z Log.getStackTraceString połączenia. Ale począwszy od Androida 4.0 (API 14) ta metoda nie jest już niezawodna, jako it returns an empty string dla UnknownHostException (zobacz Android issue #21436 po szczegóły, w skrócie: "w celu zmniejszenia ilości spew dziennika, że ​​aplikacje zrobić w stanie błędu w sieć jest niedostępna "Inżynierowie Androida zrobili IMHO wątpliwą decyzję o modyfikacji metody Log.getStackTraceString).

Dlatego lepiej jest użyć kodu podanego na początku tego postu.

+2

+1 za dobre rozwiązanie –

+0

Faktycznie opracowałem jedną aplikację, w której wiele plików SWF pozostaje w aplikacji. Te pliki SWF nie są odtwarzane w emulatorze, więc za każdym razem testuję je w urządzeniu. ale urządzenie ma ograniczenie, które nie pokazuje błędu. więc mam znaleźć to rozwiązanie –

+0

Cieszę się, że pomogłem :) – Idolon

0

można wydrukować ślad stosu do strumienia odczytywanego z niego &.

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    PrintWriter pw = new PrintWriter(baos); 

e.printStackTrace(pw); 
String stachTrace = new String(baos.toByteArray()); 

lub możesz użyć StringWriter zamiast ByteArrayOutputStream.

+0

A więc w ten sposób mogę napisać stos śledzenia do pliku tekstowego lub do konsoli, dzięki czemu mogę sprawdzić, czy do późniejszego wykorzystania. –

+0

możesz również rozważyć ramę logowania (która byłaby lepszym pomysłem), jak log4j, slf4j itp., –

0

W Twojej wyjątków użytku Handler:

StringWriter sw = new StringWriter(); 
PrintWriter pw = new PrintWriter(sw); 

e.printStackTrace(pw); 

whateverFunctionYouLikeToPrintYourStackTrace(sw.getBuffer().toString()); 

Jednakże, jesteś o wiele lepiej wyłączyć za pomocą ADB z LogCat, ponieważ ślady stos na grzanki wyglądają strasznie.

+0

Co to są Grzanki? Chcę tylko wydrukować mój stacktrace do pliku tekstowego, jeśli mogę. –

+0

Grzanki to denerwujące, szare pole w dolnej środkowej części ekranu, które jest systemowe, a niektóre z ważnych programów nie działają na systemie Android (Twitter, Gmail i in.). Są one dobre tylko do debugowania, a wtedy to nawet nie jest już dobre. Użyj logcat, to preferowane podejście. – Chiguireitor

6

Jest to możliwe, ale nie rób tego. Pokaż tylko komunikat o błędzie (nawet jeśli jest to za dużo dla "prawdziwych" użytkowników), pełny ślad stosu powinien zostać wyświetlony tylko w dzienniku.

+0

Chciałbym pokazać mój błąd w telefonie jako wiadomość toastową –

+2

Błąd! = Pełny ślad stosu.Ślad stosu pokazany jako toast będzie w większości nieczytelny. Plus zniknie po kilku sekundach, a nie będziesz miał czasu, aby go przeczytać (ponieważ jest dość długi). –

50
import android.util.Log; 

... 

String stackTrace = Log.getStackTraceString(e); 
+0

Dzięki za przypomnienie o tej użytecznej metodzie "Log". – Idolon

+6

Dzięki. Wygląda na to, że nie przyciąga uwagi na jaką zasługuje :) – Macondo2Seattle

+0

fajny krótki i łatwy – Harinder