java如何重新_关于java:如何重新抛出异常

探讨了在Android应用中如何正确配置未捕获异常处理程序以恢复系统默认的强制关闭对话框显示行为,同时记录异常信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我的onCreate()中,我设置了一个未捕获的异常处理程序,如下所示:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

@Override

public void uncaughtException(Thread thread, Throwable throwable) {

Log.e(getMethodName(2),"uncaughtException", throwable);

android.os.Process.killProcess(android.os.Process.myPid());

}

});

它工作正常,但我想恢复系统向用户显示强制关闭对话框的默认行为。

如果我试图用throw throwable替换KillProcess()调用,编译器会抱怨我需要用try/catch来包围它。

如果我用一个尝试/捕获包围它:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

@Override

public void uncaughtException(Thread thread, Throwable throwable) {

try {

Log.e(getMethodName(2),"uncaughtException", throwable);

throw throwable;

}

catch (Exception e) {

}

finally {

}

}

});

编译器仍然抱怨throw throwable需要用try/catch包围。

我该怎么再扔那个废物?这样,除了信息丰富的Log.e()之外,系统的行为与以前完全一样:我从未设置默认的未捕获异常处理程序。

尝试:

public class CustomExceptionHandler implements UncaughtExceptionHandler {

private UncaughtExceptionHandler defaultUEH;

public CustomExceptionHandler() {

this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();

}

public void uncaughtException(Thread t, Throwable e) {

Log.e("Tag","uncaughtException", throwable);

defaultUEH.uncaughtException(t, e);

}

}

然后Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler());

根据这个答案改编。

抱歉,这会导致无休止的未捕获异常流,并且根本没有强制关闭对话框。不是我要找的。

我已经更新了答案。

工作很棒!接受+ 1。

如果设置默认的未捕获异常处理程序,则需要使用其中的异常。这反映在uncaughtException没有宣布任何例外。

不应该有明显的理由再扔它。它将第二次打印在日志中,线程将无论如何死亡。如果你真的想这样做,那就用RuntimeException包起来再扔。

我理解并同意不应该有明显的理由再扔它。我定义默认未捕获异常处理程序的唯一原因是因为第一次没有日志!如果系统不打印堆栈跟踪,我想打印它。因此,处理程序。我对系统的默认行为非常满意,除了无法解释为什么无法打印android.net.http.HttpsConnection.openConnection()中未捕获异常的堆栈跟踪。+ 1。

所以您在handler中打印了它。为什么要重新投掷?线程已经死了…

根据JavaDoc的说法,没有理由重新抛出可丢弃的代码,它只是被忽略了。线程将在此时终止,您只需设置退出前要尝试的最后操作。

为了争论的目的,如果你真的想重新抛出一个可丢弃的,你应该做如下的事情:

public void reThrow(Throwable t) {

if (RuntimeException.class.isAssignableFrom(t.getClass())) {

throw (RuntimeException)t;

} else if (Error.class.isAssignableFrom(t.getClass())) {

throw (Error) t;

} else {

throw new UndeclaredThrowableException(t);

}

}

+ 1。因为我同意你的说法,所以我甚至不会再尝试扔东西(见我对@alexgitelman的评论)。不过,最好还是向用户显示熟悉的强制关闭对话框。你知道怎么做吗?

首先,您不需要重新抛出异常。uncaughtException()不使用异常。但是,您必须调用默认的未捕获异常处理程序的方法。就像,

class MyUEH implements UncaughtExceptionHandler {

private static final UncaughtExceptionHandler default = Thread.getDefaultUncaughtExceptionHandler();

public void uncaughtException(Thread t, Throwable e) {

Log.e("Tag","uncaughtException", throwable);

default.uncaughtException(t, e);

}

}

第二,你不需要自己扼杀这个过程。当您调用它时,默认的UEH将处理这个问题。

第三,默认的UEH将向用户显示(或导致显示)标准崩溃(强制关闭)对话框。请记住,如果您的方法挂起(例如,因为您正在执行IO),那么在您的方法退出之前,用户将看不到崩溃对话框。

我喜欢你的回答,但事实是,如果我在我的处理程序的第一个版本中注释了killProcess()语句(只留下Log.e()语句),则不会显示强制关闭对话框,应用程序的视图只会冻结,直到我手动强制关闭应用程序。

是的,你是对的。我忘记了有关调用默认UEH的小道消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值