web-dev-qa-db-ja.com

すべてのタイプの例外プログラミングをキャッチAndroid

Android OS用のアプリケーションを開発しています。これは最初のアプリケーションなので、プログラミングの間違いを犯したため、バグを原因までたどることができません。推測して、バグを修正しようとしているときに、アクティビティのライフサイクル全体ですべてのタイプの例外を1つのtry-catchでキャッチする方法はありますか?

それは素晴らしいでしょう、私は私の銀河Sを見るのに飽きてきましたS:「申し訳ありませんが、アプリケーションアプリが予期せず停止しました」:(

16
Archimedis

私は本当に、これはお勧めしません...

try {
     ...
} catch (Exception e) {
     // This will catch any exception, because they are all descended from Exception
}

問題をデバッグするためにスタックトレースを見ていますか?それらを追跡することは難しくありません。 LogCatを見て、赤いテキストの大きなブロックを確認して、クラッシュの原因となったメソッドとエラーを確認します。

この方法ですべてのエラーをキャッチすると、プログラムは期待どおりに動作せず、ユーザーがレポートしたときにAndroid Marketからエラーレポートが届きません。

UncaughtExceptionHandlerを使用すると、クラッシュを防ぐことができます。私は1つを使用していますが、コンピューターから離れた電話でアプリをデバッグしているときのために、スタックトレースをファイルに出力するためだけに使用します。しかし、キャッチした例外をデフォルトのAndroid UncaughtExceptionHandlerに渡しました。これは、Androidで正しく処理できるようにするためです。ユーザーにスタックトレースを送信する機会を与えます。

20
Tenfour04

私は純粋なJavaのように仮定しています

try {

} catch(throwable t) {

}

しかし、これは非常に悪い習慣です。

また見て

ncaughtExceptionハンドラーの設定

7
MJB

Eclipseを使用している場合は、アプリを強制終了するすべての例外(別名メッセージ)を「LogCat」に記録する必要があります。

LogCatを表示する最も簡単な方法は、DDMSパースペクティブを開き、[LogCat]タブをクリックします(まだ表示されていない場合は、[表示]メニューから開きます)。

1
Vicente Plata
import Java.io.FileOutputStream;
import Java.io.IOException;

import Android.app.Activity;
import Android.content.Context;

public class SRSDexception implements Thread.UncaughtExceptionHandler {

private Thread.UncaughtExceptionHandler defaultUEH;

private Activity app = null;

public SRSDexception(Activity app) {
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
    this.app = app;

}

public void uncaughtException(Thread t, Throwable e) 
{   

StackTraceElement[] arr = e.getStackTrace();
String Raghav =t.toString();
String report = e.toString()+"\n\n";
report += "--------- Stack trace ---------\n\n"+Raghav;
for (int i=0; i<arr.length; i++)
{
report += "    "+arr[i].toString()+"\n";
}
report += "-------------------------------\n\n";

// If the exception was thrown in a background thread inside
// AsyncTask, then the actual exception can be found with getCause
report += "--------- Cause ---------\n\n";
Throwable cause = e.getCause();
if(cause != null) {
report += cause.toString() + "\n\n";
arr = cause.getStackTrace();
for (int i=0; i<arr.length; i++)
{
report += "    "+arr[i].toString()+"\n";
}
}
report += "-------------------------------\n\n";

try {
FileOutputStream trace = app.openFileOutput(
"stack.trace", Context.MODE_PRIVATE);
trace.write(report.getBytes());
trace.close();
} catch(IOException ioe) {
// ...
}

defaultUEH.uncaughtException(t, e);
}

}
1
Raghav Chopra