全局捕获所有可能的 android 异常并重新加载应用程序
Catch all possible android exception globally and reload application
我知道防止系统崩溃的最好方法是用不同的方法捕获所有可能的异常。所以我在我的代码中的每个地方都使用 try catch 块。但是,如您所知,有时您会忘记测试某些场景,这些场景会导致一些未处理的异常,并且用户会收到 "Unfortunately App stopped working..." 消息。这对任何应用程序都是不利的。不幸的是,将使用我的应用程序的人的母语不是英语,因此他们也不会理解崩溃消息。
所以我想知道是否有可能全局捕获所有可能的异常(在某些主要 类 而非所有 类 和方法中仅使用一个 try catch 块!!!)和 自动重新加载应用程序并且没有任何奇怪的消息?或者至少可以更改崩溃消息?
谢谢。
在你的 onCreate
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
//Catch your exception
// Without System.exit() this will not work.
System.exit(2);
}
});
So I want to know is it possible to catch all possible exception globally ... and reload application automatically
不要这样做。 如果您的应用进入一种状态,即使只是启动它也会导致崩溃,您将创建一个用户无法获得的崩溃和重新启动的无限循环出.
错误信息并不奇怪;这是系统消息,已翻译成设备上所有支持的语言。
您唯一应该做的就是使用某种 crash reporting library 向您报告崩溃而无需用户执行任何操作,这样您就可以修复您的应用并提交更新。您可以在您的应用程序的 onCreate()
中设置自定义 UncaughtExceptionHandler
,但我会将其限制为记录数据并可能准备将其发送给您以进行调试,然后 转发回调默认 UncaughtExceptionHandler
。这正是崩溃报告库的作用。
I know the best way to prevent system crashes is catching all possible exception in different methods. So I use try catch blocks every where in my code.
不,最好的方法是在发布前编写好的代码和修复错误。不加区别地捕获所有形式的异常被认为是不好的做法。您应该仅在
处使用 try-catch 块
- 方法调用可以抛出已检查的异常,在这种情况下,编译器会强制您用 try-catch 包围或重新抛出异常;或
- 您想处理某些未经检查的(运行时)异常。一个例子是用
Integer.parseInt()
之类的东西解析用户输入,捕获 NumberFormatException
并向用户显示他们的输入无效的消息。
However as you know sometimes you forget to test some scenarios
然后改进您的编码和测试实践。不要以此为借口轻举妄动
Unfortunately the people who will use my app are not native English, so they will not understand crash message too.
哪个崩溃信息?如果您指的是系统的崩溃消息,那应该是他们将设备设置为的任何语言。如果您指的是 您的 崩溃消息(例如在 logcat 中),则他们不必这样做。他们应该向您发送崩溃消息,您应该修复应用程序并分发更新。不要指望最终用户在确定导致您的应用程序崩溃的原因时做任何跑腿工作。最好使用某种崩溃报告库。
好了:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
new Thread() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(getActivity(),"Your message", Toast.LENGTH_LONG).show();
Looper.loop();
}
}.start();
try
{
Thread.sleep(4000); // Let the Toast display before app will get shutdown
}
catch (InterruptedException e) { }
System.exit(2);
}
});
我知道防止系统崩溃的最好方法是用不同的方法捕获所有可能的异常。所以我在我的代码中的每个地方都使用 try catch 块。但是,如您所知,有时您会忘记测试某些场景,这些场景会导致一些未处理的异常,并且用户会收到 "Unfortunately App stopped working..." 消息。这对任何应用程序都是不利的。不幸的是,将使用我的应用程序的人的母语不是英语,因此他们也不会理解崩溃消息。
所以我想知道是否有可能全局捕获所有可能的异常(在某些主要 类 而非所有 类 和方法中仅使用一个 try catch 块!!!)和 自动重新加载应用程序并且没有任何奇怪的消息?或者至少可以更改崩溃消息?
谢谢。
在你的 onCreate
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
//Catch your exception
// Without System.exit() this will not work.
System.exit(2);
}
});
So I want to know is it possible to catch all possible exception globally ... and reload application automatically
不要这样做。 如果您的应用进入一种状态,即使只是启动它也会导致崩溃,您将创建一个用户无法获得的崩溃和重新启动的无限循环出.
错误信息并不奇怪;这是系统消息,已翻译成设备上所有支持的语言。
您唯一应该做的就是使用某种 crash reporting library 向您报告崩溃而无需用户执行任何操作,这样您就可以修复您的应用并提交更新。您可以在您的应用程序的 onCreate()
中设置自定义 UncaughtExceptionHandler
,但我会将其限制为记录数据并可能准备将其发送给您以进行调试,然后 转发回调默认 UncaughtExceptionHandler
。这正是崩溃报告库的作用。
I know the best way to prevent system crashes is catching all possible exception in different methods. So I use try catch blocks every where in my code.
不,最好的方法是在发布前编写好的代码和修复错误。不加区别地捕获所有形式的异常被认为是不好的做法。您应该仅在
处使用 try-catch 块- 方法调用可以抛出已检查的异常,在这种情况下,编译器会强制您用 try-catch 包围或重新抛出异常;或
- 您想处理某些未经检查的(运行时)异常。一个例子是用
Integer.parseInt()
之类的东西解析用户输入,捕获NumberFormatException
并向用户显示他们的输入无效的消息。
However as you know sometimes you forget to test some scenarios
然后改进您的编码和测试实践。不要以此为借口轻举妄动
Unfortunately the people who will use my app are not native English, so they will not understand crash message too.
哪个崩溃信息?如果您指的是系统的崩溃消息,那应该是他们将设备设置为的任何语言。如果您指的是 您的 崩溃消息(例如在 logcat 中),则他们不必这样做。他们应该向您发送崩溃消息,您应该修复应用程序并分发更新。不要指望最终用户在确定导致您的应用程序崩溃的原因时做任何跑腿工作。最好使用某种崩溃报告库。
好了:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
new Thread() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(getActivity(),"Your message", Toast.LENGTH_LONG).show();
Looper.loop();
}
}.start();
try
{
Thread.sleep(4000); // Let the Toast display before app will get shutdown
}
catch (InterruptedException e) { }
System.exit(2);
}
});