在android上使用全局异常处理

Gra*_*tzi 58 android exception-handling

是否有代码示例或有关如何使用该Thread.setDefaultUncaughtExceptionHandler方法的教程?基本上我在我的应用程序中尝试在抛出异常时显示自定义警报对话框.是否有可能做到这一点?我知道在屏幕上显示某些内容有点棘手,如果在UI线程中抛出异常,但我不知道任何解决方法.

Cod*_*ife 75

使用解决方案来到此页面的人的基本示例:)

public class ChildActivity extends BaseActivity {
    @SuppressWarnings("unused")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int a=1/0;
    }
}
Run Code Online (Sandbox Code Playgroud)

处理错误的类别:

public class BaseActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
                Log.e("Alert","Lets See if it Works !!!");
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这只会导致应用程序在应用程序崩溃时冻结. (12认同)
  • 您是否需要再次抛出异常以停止执行而不是让线程处于未确定状态? (2认同)

Sam*_*Sam 34

这里的一个变种,答案莫特·沙玛有以下改进:

  • 错误处理后不会导致app/service冻结
  • 让Android在你自己之后执行正常的错误处理

码:

public class BaseActivity extends Activity {
    @Override
    public void onCreate() {
        super.onCreate();

        final Thread.UncaughtExceptionHandler oldHandler =
            Thread.getDefaultUncaughtExceptionHandler();

        Thread.setDefaultUncaughtExceptionHandler(
            new Thread.UncaughtExceptionHandler() {
                @Override
                public void uncaughtException(
                    Thread paramThread,
                    Throwable paramThrowable
                ) {
                    //Do your own error handling here

                    if (oldHandler != null)
                        oldHandler.uncaughtException(
                            paramThread,
                            paramThrowable
                        ); //Delegates to Android's error handling
                    else
                        System.exit(2); //Prevents the service/app from freezing
                }
            });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,问晚了,但是您在“System.exit()”调用中使用退出代码 2 是否有原因?Android 是否关心退出代码?我似乎无法找到有关此的任何信息... (2认同)

Dru*_*nya 5

对于那些只想在您的应用程序在设备上崩溃时(在调试配置中)查看异常详细信息的人。这是应用程序类:

private Thread.UncaughtExceptionHandler oldHandler;

@Override
public void onCreate() {
    super.onCreate();

    if (!BuildConfig.DEBUG)
        return;

    oldHandler = Thread.getDefaultUncaughtExceptionHandler();
    Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
        try {
            StringWriter sw = new StringWriter();
            e.printStackTrace(new PrintWriter(sw));

            Intent intent = new Intent(Intent.ACTION_SEND);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra(Intent.EXTRA_TEXT, sw.toString());
            intent.setType("text/plain");
            startActivity(intent);
        } catch(Exception ex) {
            ex.printStackTrace();
        } finally {
            if (oldHandler != null)
                oldHandler.uncaughtException(t, e);
            else
                System.exit(1);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

它使用外部应用程序,因为您的 UI 线程可能不再工作。


luv*_*ere 4

请记住,The RuntimePermission("setDefaultUncaughtExceptionHandler")在设置处理程序之前会进行检查,并确保通过抛出未捕获的异常来导致进程停止,因为事情可能处于不确定状态。

不要显示任何内容,实际上 UI 线程可能是崩溃的线程,请改为写入日志和/或将详细信息发送到服务器。您可能想查看这个问题及其答案