web-dev-qa-db-ja.com

Android例外処理のベストプラクティス?

アプリがクラッシュした場合、Androidからアプリがクラッシュしたため閉じる必要があると通知されるまで、数秒間ハングします。だから、私は一般的なもので私のアプリのすべての例外をキャッチすることを考えていました:

try {
    // ... 
} catch(Exception e) { 
    // ...
} 

そして、Androidのおかげで遅延が発生する代わりに、アプリケーションが即座にクラッシュしたことを説明する新しいActivityを作成します(また、ユーザーにエラーの詳細をメールで送信する機会を与えます)。これを達成するためのより良い方法はありますか?

更新: ARTが有効になっているNexus 5を使用していますが、アプリのクラッシュ(元々話していた「ハング」)を経験していた遅延に気づいていません。今はすべてがネイティブコードであるため、クラッシュはすべてのクラッシュ情報を取得すると同時に発生します。おそらく、Nexus 5は簡単です:)にもかかわらず、これはAndroidの将来のリリースでは心配ないかもしれません(ARTがAndroid Lのデフォルトのランタイムになると仮定して)。

72
ldam

ここで、 参照用リンク を確認してください。

ここで、クラスを作成しますExceptionHandler that implements Java.lang.Thread.UncaughtExceptionHandler ..

このクラス内では、スタックトレースを作成したり、エラーレポートなどをアップロードする準備をするなど、命を救うことができます。

重要な部分になりましたつまり、その例外をキャッチする方法。それは非常に簡単ですが。オーバーライドされたonCreateメソッドでスーパーメソッドを呼び出した直後に、各アクティビティの次のコード行をコピーします。

Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));

アクティビティは次のようになります…

public class ForceClose extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));

        setContentView(R.layout.main);
    }
}

お役に立てれば...

94
CRUSADER

汎用アラートダイアログを使用して、エラーメッセージをすばやく表示できます。例えば...

//******************************************
//some generic method
//******************************************
private void doStuff()
{       
    try
    {
        //do some stuff here
    }
    catch(Exception e)
    {
        messageBox("doStuff", e.getMessage());
    }
}


//*********************************************************
//generic dialog, takes in the method name and error message
//*********************************************************
private void messageBox(String method, String message)
{
    Log.d("EXCEPTION: " + method,  message);

    AlertDialog.Builder messageBox = new AlertDialog.Builder(this);
    messageBox.setTitle(method);
    messageBox.setMessage(message);
    messageBox.setCancelable(false);
    messageBox.setNeutralButton("OK", null);
    messageBox.show();
}

スタックトレースの印刷など、他のエラー処理オプションをこのメソッドに追加することもできます

9
Louis Evans

logクラスに「wtf」(なんとひどい失敗)メソッドが見つかりました。説明から:

システム構成によっては、レポートがDropBoxManagerに追加されたり、エラーダイアログでプロセスがすぐに終了したりする場合があります。

http://developer.Android.com/reference/Android/util/Log.html

これが誰かを助けることを願っています

3
sunyata