Java 捕获所有类型的异常

Java 捕获所有类型的异常,java,android,exception,exception-handling,Java,Android,Exception,Exception Handling,我正在为Android操作系统开发一个应用程序。 由于这是我的第一个应用程序,我认为我犯了一些编程错误,因为我几乎无法追溯错误的原因。 因此,我在猜测,当我试图修复bug时,是否有一种方法可以通过一次尝试捕获来捕获整个活动生命周期中的所有类型的异常 那太棒了,我看我的galaxy S说:“对不起,应用程序意外停止了”:(我想是纯java try { } catch(throwable t) { } 但这是非常糟糕的做法 也看看 我真的,真的不推荐这个 try { ... } ca

我正在为Android操作系统开发一个应用程序。 由于这是我的第一个应用程序,我认为我犯了一些编程错误,因为我几乎无法追溯错误的原因。 因此,我在猜测,当我试图修复bug时,是否有一种方法可以通过一次尝试捕获来捕获整个活动生命周期中的所有类型的异常


那太棒了,我看我的galaxy S说:“对不起,应用程序意外停止了”:(

我想是纯java

try {

} catch(throwable t) {

}
但这是非常糟糕的做法

也看看


我真的,真的不推荐这个

try {
     ...
} catch (Exception e) {
     // This will catch any exception, because they are all descended from Exception
}
您是否正在查看堆栈跟踪以调试问题?跟踪它们应该不难。查看LogCat并查看一大块红色文本,以了解是哪种方法导致了崩溃以及错误是什么

如果您以这种方式捕获所有错误,您的程序将无法按预期运行,并且当您的用户报告错误时,您将无法从Android Market获得错误报告


你可以使用UncaughtExceptionHandler来防止一些崩溃。我使用UncaughtExceptionHandler,但仅将堆栈跟踪打印到一个文件中,当我在远离计算机的手机上调试应用程序时。但在我完成后,我将UncaughtExceptionHandler传递给默认的安卓UncaughtExceptionHandler,因为我希望安卓能够处理它正确,并给用户发送堆栈跟踪的机会。

如果您在Eclipse上,强制关闭应用程序的每个异常(即您提到的消息)都应该记录在“LogCat”中

查看LogCat最简单的方法是在LogCat选项卡上打开DDMS透视图和clic(如果尚未显示,则从“视图”菜单打开它)。

import java.io.FileOutputStream;
导入java.io.IOException;
导入android.app.Activity;
导入android.content.Context;
公共类SRSDexception实现Thread.UncaughtExceptionHandler{
private Thread.UncaughtExceptionHandler defaultUEH;
私人活动app=null;
公共SRSDexception(活动应用程序){
this.defaultUEH=Thread.getDefaultUncaughtExceptionHandler();
this.app=app;
}
公共无效未捕获异常(线程t,可丢弃的e)
{   
StackTraceElement[]arr=e.getStackTrace();
字符串Raghav=t.toString();
字符串报告=e.toString()+“\n\n”;
报告+=“-----------堆栈跟踪----------------\n\n”+Raghav;

对于(int i=0;iYes,我认为OP需要的是UncaughtExceptionHandler。您可以将其设置为不爆炸并显示“强制关闭”消息,但通常你还是希望它结束,因为你可能无法恢复。是的,UncaughtExceptionhandler正是我要找的。谢谢!是的,你当然不建议这样做,但我想知道我是否有机会处理所有未捕获的异常,并通过一个自定义活动通知用户(尽管如此,使用UncaughtExceptionHandler仍无法正确启动新活动).无论如何,我在Debug透视图中看到了Logcat选项卡,但我从未看过它,谢谢大家的提示!P.S.如何实现UncaughtExceptionHandler和AndroidUncaughtExceptionHandler之间的通道?在构造函数中,将mDefaultUEH=Thread.getDefaultUncaughtExceptionHandler();然后在uncaughtException(…)在方法末尾调用mDefaultUEH.uncaughtException()。它不会捕获“OutOfMemoryError”异常。如果你想阻止你的应用程序崩溃,那么你需要捕获所有的
可丢弃的
,就像MJB的答案一样。你不能捕获
OutOfMemoryError
,因为它不是一个异常,它是继承
可丢弃的另一个类
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);
}

}