如何捕获Fragment中抛出的RuntimeException

时间:2014-02-06 22:10:44

标签: java android android-fragments

我的应用中嵌入了Android Fragment。在部署期间,我已经让某些Android子系统抛出了未记录的RuntimeException个实例。很烦人,但我想我会抓住ActivityFragment。不幸的是,到目前为止我还没有太成功。

我的布局XML如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <fragment android:name="com.my.ui.MyFragment"
        android:id="@+id/my_frag"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

要模拟RuntimeException,我将其添加到MyFragment.onResume

public void onResume() {
    super.onResume();
    ...
    throw new RuntimeException("Boom.");
}

为了尝试在Activity中捕获它,我想也许它会在布局通胀过程中发生,所以我在try-catch中包围了setContentView调用:

public void onCreate() {
    super.onCreate();
    try {
        setContentView(R.layout.base_layout);
    } catch(Exception e) {
        Log.e(TAG, e.getMessage());
    }
}

修改 在我写完这个问题之后,想到尝试从MyActivity.onResume中的super.onResume()中抓取一些东西:

public void onResume() {
        try {
            super.onResume();
            ...
        } catch(Exception e) {
            Log.d(TAG, "I caught something baby!!!");
            Log.e(TAG, e.getMessage());
        }
    }

不幸的是,没有骰子......似乎Android框架可能会在我的Activity之前找到它。以下是相关的LogCat:

02-06 16:19:36.908: E/AndroidRuntime(29033): FATAL EXCEPTION: main
02-06 16:19:36.908: E/AndroidRuntime(29033): Process: com.my.myactivity, PID: 29033
02-06 16:19:36.908: E/AndroidRuntime(29033): java.lang.RuntimeException: Unable to resume activity {com.my.myactivity/com.my.myactivity.MyActivity}: java.lang.RuntimeException: Boom.
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2788)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2817)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2250)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.app.ActivityThread.access$800(ActivityThread.java:135)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.os.Handler.dispatchMessage(Handler.java:102)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.os.Looper.loop(Looper.java:136)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.app.ActivityThread.main(ActivityThread.java:5017)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at java.lang.reflect.Method.invokeNative(Native Method)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at java.lang.reflect.Method.invoke(Method.java:515)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at dalvik.system.NativeStart.main(Native Method)
02-06 16:19:36.908: E/AndroidRuntime(29033): Caused by: java.lang.RuntimeException: Boom.
02-06 16:19:36.908: E/AndroidRuntime(29033):    at com.my.ui.MyFragment.onResume(MyFragment.java:97)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.app.Fragment.performResume(Fragment.java:1743)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:924)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1044)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:1863)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.app.Activity.performResume(Activity.java:5320)
02-06 16:19:36.908: E/AndroidRuntime(29033):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2778)
02-06 16:19:36.908: E/AndroidRuntime(29033):    ... 12 more

是否有可能捕获片段在其生命周期阶段中抛出的异常,或者我是否需要捕获它并通过Handler或自定义回调接口发送异常?

1 个答案:

答案 0 :(得分:0)

任何调用onResume的人都可以捕获此异常 你不能只用另一个不相关的方法来捕获它。

考虑调用堆栈上发生的事情。

仅当对onCreate的调用导致对onResume的调用时 (直接或间接),然后你可以在onCreate上抓住它 没有其他人抓住它。

所以,如果你有这一系列的电话:
some code -> onCreate -> A -> B -> C -> ... -> D -> onResume
和方法D,...,C,B,A没有捕获异常,
那么你可以在onCreate中捕获它。

我对Android不熟悉,所以回答一下。

我严重怀疑你在Android中有这一系列的通话 我想框架是独立调用这两种方法的 我的意思是只看方法名称,我猜它没有 有意义的是我上面写的这个调用链。