android忽略全局异常,在android上使用全局异常处理

是否有代码示例,或关于如何使用Thread.setDefaultUncaughtExceptionHandler方法的教程?基本上,我试图在应用程序中显示一个自定义警报对话框,每当抛出异常时。可以这样做吗?我知道在屏幕上显示一些东西有点困难,如果在UI线程中抛出异常,但我不知道有什么解决方法。

我能问一下重点是什么吗?标准的Android对话框允许用户报告崩溃,这将向您的帐户发送堆栈跟踪。如果你真的想这样做-好吧,只要用theme.dialog开始一个新的意图,在附加文件中传递异常信息,就可以设置了。

在我的应用程序中,我使用的是一个数据库文件。如果应用程序未能连接到数据库,将引发异常。我想捕获此异常并显示自定义消息。这只是一个例子。还有更多类似的情况。所以我最好把所有这些异常都及时发现。

这听起来不是个好主意。连接到数据库失败是一个特定的问题,但有一个特定的异常。您正在处理任何可能的异常,包括由于代码草率而导致的NullPointerException。我强烈建议在只捕获特定于数据库的异常的数据库代码周围放置try/catch块。

在我的代码中,有许多操作包括数据库。我试图找到一种方法,而不是每次执行数据库操作时都使用Try-Catch块。你是说最好的做法是坚持试抓块吗?不是一种处理这些案件的方法吗?

"你是说最好的做法是坚持试抓块吗?"——嗯,是的。

对于带着解决方案来到此页的人的基本示例:)

public class ChildActivity extends BaseActivity {

@SuppressWarnings("unused")

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

int a=1/0;

}

}

处理错误的类:

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 !!!");

}

});

}

}

您不需要再次抛出异常来停止执行而不让线程处于未确定状态吗?

我做不到你的:D。在未受注意的例外情况下,你可以提供任何你想要的东西。

@维登:不需要再抛出异常。操作系统已经终止了线程,因此在处理程序完成后将不会返回到该线程。

我的一些其他活动告诉我,我做了这些之后,Cannot reduce the visibility of the inherited method from BaseActivity。刚刚意识到问题所在。baseactivity的onCreate被设置为public,但我的所有后续活动的onCreate都被设置为protected。刚刚把baseactivity改成protected。

这只会导致应用程序在应用程序崩溃时冻结。

@山姆:请分享IMPL,只有在那之后我才能发表评论。

添加system.exit(0);

下面是Mohit Sharma给出的答案的一个变体,有以下改进:

百万千克1在错误处理后不会导致应用程序/服务冻结百万千克1百万千克1让android在你自己的操作之后进行正常的错误处理百万千克1

代码:

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

}

});

}

}

抱歉,最近的问题,但您在System.exit()呼叫中使用退出代码2有什么原因吗?安卓关心退出代码吗?我似乎找不到任何关于这个的信息…

@马库萨,我不记得我为什么用那个代码了。可能是0和1导致应用程序冻结或其他原因。

六羟甲基三聚氰胺六甲醚。。。我想这可能值得一个单独的问题:stackoverflow.com/question s/30226842/…让我们看看它会带来什么……

回答很好,但我在使用你的答案时遇到了两个问题。首先,如果您让所有活动继承自BaseActivity,或者重新启动继承自BaseActivity的活动,则将所有默认处理程序链接在一起:第一意图:自定义异常处理程序(CEH)调用默认异常处理程序(DEH)第二意图:CEH->CEH of First意图->DEH Third意图:CEH->CEH O第二意图->第一意图的CEH->DEH…..这会导致多次调用您定义的操作,并最终导致内存不足异常。

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

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

我只是想指出我目前的经验。我正在使用https://stackoverflow.com/a/26560727/2737240建议的解决方案将异常刷新到日志文件中,然后再将控制权授予默认的异常处理程序。

但是,我的结构如下:

BaseActivity

|

_______________________

|          |          |

Activity A Activity B Activity C

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

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

@Override

public void uncaughtException(Thread thread, Throwable e) {

handleUncaughtException(thread, e, defaultEH);

}

});

其中handleUncaughtException(thread, e, defaultEH);写入日志并将调用移交给原始的未捕获异常处理程序。

所以使用这个代码所发生的事情是:

百万千克1活动A已实例化百万千克1百万千克1新的默认异常处理程序(DEH)现在是我的日志处理程序+旧的DEH百万千克1百万千克1活动B已实例化百万千克1百万千克1新DEH现在是我的日志处理程序+旧DEH(日志处理程序+原始DEH)百万千克1百万千克1活动C已实例化百万千克1百万千克1新DEH现在是我的日志处理程序+旧DEH(日志处理程序+日志处理程序+原始DEH)百万千克1

因此,这是一个无限增长的链条,导致了两个问题:

百万千克1指定的自定义代码(在我的例子中是写入日志文件)将被多次调用,这不是所需的操作。百万千克1百万千克1defaulteh的引用甚至在活动完成后仍保留在堆中,因为引用链使用了它,所以可能发生的最糟糕的事情是内存不足异常。百万千克1

因此,我又增加了一件事,最终使这项工作顺利进行:

private static boolean customExceptionHandlerAttached = false;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

if(!customExceptionHandlerAttached) {

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

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

@Override

public void uncaughtException(Thread thread, Throwable e) {

handleUncaughtException(thread, e, defaultEH);

}

});

customExceptionHandlerAttached = true;

}

}

使用此解决方案,我们可以确保:

百万千克1为所需操作添加自定义异常处理程序百万千克1百万千克1确保此操作仅触发一次百万千克1百万千克1允许垃圾收集器通过调用finish()完全处理我们的活动百万千克1

如果你想使用这个库

https://github.com/selimtoksal/android-catch-global-exception-library

创建TransferObject并非所有活动都只用于基本活动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值