1

我在我的 'sUncaughtExceptionHandler中为当前线程设置了一个默认值,并从我的侦听器中抛出一个,但没有捕获到异常。我也尝试从and抛出异常,但没有被捕获。但是,当从或抛出时,它会被捕获。ActivityonCreate()RunTimeExceptionAlertDialogonClick()onCreateOptionsMenu()onOptionsItemSelected()onCreate()onResume()

这是我的活动:

public class MainActivity extends AppCompatActivity implements DialogInterface.OnClickListener {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Thread.setDefaultUncaughtExceptionHandler(new DefExcHandler());
        Log.d(TAG, "onCreate: "+Thread.currentThread().getName()+" "+Thread.currentThread().getId());

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setNeutralButton("CRASH", this);
        AlertDialog dialog = builder.create();
        dialog.show();
        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.dismiss();
        Log.d(TAG, "onClick: "+Thread.currentThread().getName()+" "+Thread.currentThread().getId());
        throw new RuntimeException();
    }
}

这是我的异常处理程序:

public class DefExcHandler implements Thread.UncaughtExceptionHandler {

    private static final String TAG = "DefExcHandler";

    public DefExcHandler() {
        Log.d(TAG, "DefaultExceptionHandler: ");
    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        Log.d(TAG, "Uncaught exception caught: "+ex.getMessage()+" "+ex.getCause().toString());
    }
}

根据我在活动中制作的日志消息,线程在onCreate()和中是相同的onClick()

09-27 15:00:57.260 10667-10667/a.b.c D/MainActivity: onCreate: main 1
09-27 15:01:52.680 10667-10667/a.b.c D/MainActivity: onClick: main 1

为什么从onClick(),onCreateOptionsMenu()或抛出异常时没有捕获到异常onOptionsItemSelected()

4

1 回答 1

0

我试图重现应用程序的行为。该DefExcHandler实例似乎被遗漏了,因为它没有记录任何内容,但我尝试了另外两个有效的方法:断点和文件创建。

请尝试在里面设置断点uncaughtException()。我相信它会停止你的代码中的执行。我在下面编写了一个示例,该示例使用文件作为标志来指示未捕获的异常处理程序确实被调用了。

总而言之,似乎DefExcHandler.uncaughtException()正在调用它,但由于某种未知原因(可能是内部竞争条件),Android 无法进行日志记录。

// Example that assures that an UncaughtExceptionHandler
// is being invoked by flagging execution with file creation.

public class MainActivity extends ... implements ... {

    private File mCrashFile;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        mCrashFile = new File(getFilesDir(), "crash");

        // Crash file existence means the application has crashed before.
        Log.d(TAG, "crash file exists: " + mCrashFile.exists());

        // Clear crash flag.
        if (mCrashFile.exists()) {
            Log.d(TAG, "crash file delete: " + mCrashFile.delete());
        }

        Thread.setDefaultUncaughtExceptionHandler(new DefExcHandler());

        ...

    }

    private class DefExcHandler implements Thread.UncaughtExceptionHandler {

        @Override
        public void uncaughtException(Thread thread, Throwable ex) {

            // Set crash flag.
            try {
                mCrashFile.createNewFile();
            } catch (IOException e) {
                // dunno if it really prints anything
                e.printStackTrace();
            }
        }
    }
}
于 2016-09-27T18:12:59.317 回答