我正在为Android操作系统开发应用程序。 由于这是我的第一个应用程序,我认为我犯了一些编程错误,因为我几乎无法追踪错误的原因。 因此,我猜测,虽然我正在尝试修复错误,有没有办法在我的整个活动生命周期中使用一个try-catch捕获所有类型的异常?
那会很棒,我很无聊看着我的银河系S说:“抱歉应用程序App已经意外停止了”:(
答案 0 :(得分:20)
我真的,真的不推荐这个...
try {
...
} catch (Exception e) {
// This will catch any exception, because they are all descended from Exception
}
您是否正在查看堆栈跟踪以调试问题?跟踪它们应该不难。查看LogCat并查看大块红色文本以查看导致崩溃的方法以及您的错误。
如果您以这种方式捕获所有错误,您的程序将无法按预期运行,并且当您的用户报告时,您将无法从Android电子市场获得错误报告。
您可以使用UncaughtExceptionHandler来防止一些崩溃。我使用一个,但仅用于将堆栈跟踪打印到文件,因为我正在远离计算机的手机上调试应用程序。但是在我完成之后,我将未捕获的异常传递给默认的Android UncaughtExceptionHandler,因为我希望Android能够正确处理它,并让用户有机会向我发送堆栈跟踪。
答案 1 :(得分:7)
答案 2 :(得分:1)
如果您使用的是Eclipse,则应该在“LogCat”中记录强制关闭应用程序的所有异常(也就是您提到的消息)。
查看LogCat的最简单方法是在LogCat选项卡上打开DDMS透视图和clic(如果尚未显示,则从“视图”菜单中打开它)。
答案 3 :(得分:1)
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
public class SRSDexception implements Thread.UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler defaultUEH;
private Activity app = null;
public SRSDexception(Activity app) {
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
this.app = app;
}
public void uncaughtException(Thread t, Throwable e)
{
StackTraceElement[] arr = e.getStackTrace();
String Raghav =t.toString();
String report = e.toString()+"\n\n";
report += "--------- Stack trace ---------\n\n"+Raghav;
for (int i=0; i<arr.length; i++)
{
report += " "+arr[i].toString()+"\n";
}
report += "-------------------------------\n\n";
// If the exception was thrown in a background thread inside
// AsyncTask, then the actual exception can be found with getCause
report += "--------- Cause ---------\n\n";
Throwable cause = e.getCause();
if(cause != null) {
report += cause.toString() + "\n\n";
arr = cause.getStackTrace();
for (int i=0; i<arr.length; i++)
{
report += " "+arr[i].toString()+"\n";
}
}
report += "-------------------------------\n\n";
try {
FileOutputStream trace = app.openFileOutput(
"stack.trace", Context.MODE_PRIVATE);
trace.write(report.getBytes());
trace.close();
} catch(IOException ioe) {
// ...
}
defaultUEH.uncaughtException(t, e);
}
}