java - 当我无法使用调试器时,如何以字符串形式获取错误消息
问题描述
我希望能够将整个错误日志保存到 java 中的字符串。例如,如果我有这条线
int a = 0/0
那么这会在调试器中给出以下错误消息:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at HelloWorld.main(HelloWorld.java:8)
我想要的是能够将上述错误消息完全放在一个字符串中。我已经尝试在 try/catch 块中包含我想要的错误字符串(对于这个例子,除以零)的代码,如下所示,但这只是给了我java.lang.ArithmeticException: / by zero
它的一部分。
这是我的 try/catch 块:
try{
int a = 0/0;
}catch(Exception e){
String a = getFullErrorString(e);
}
我的方法是:
public static String getFullErrorString(Throwable error){
return(
error.getCause() == null ? String.valueOf(error) : (error + "\n" + getFullErrorString(error.getCause()))
);
}
我需要这样做,因为我的应用程序不能同时使用调试器和外部设备(外部设备使用 USB-C 端口,因此我无法在插入它的情况下进行调试,并且蓝牙不是一个选项,因为我的应用大量使用蓝牙)。请帮忙!
解决方案
这是一个我发现对捕获和记录异常有用的类:
String rootDir = Environment.getExternalStorageDirectory().getPath();
//----------------------------------------------------
// Define inner class to handle exceptions
class MyExceptionHandler implements Thread.UncaughtExceptionHandler {
public void uncaughtException(Thread t, Throwable e){
java.util.Date dt = new java.util.Date();
String fn = rootDir + "/YourFilenameHere_" + sdf.format(dt) + "_DBG.txt";
try{
PrintStream ps = new PrintStream( fn );
e.printStackTrace(ps);
ps.close();
System.out.println("wrote trace to " + fn);
e.printStackTrace(); // capture here also???
// SaveStdOutput.stop(); // close here vs calling flush() in class
}catch(Exception x){
x.printStackTrace();
}
lastUEH.uncaughtException(t, e); // call last one Gives: "Unfortunately ... stopped" message
return; //???? what to do here
}
}
Thread.UncaughtExceptionHandler lastUEH = null;
// Then in onCreate:
lastUEH = Thread.getDefaultUncaughtExceptionHandler(); // save previous one
Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());
堆栈跟踪被写入文件。
推荐阅读
- javascript - 在 Dygraph 的 Y 轴标签中添加逗号分隔符
- swift - 可选类型“AVCaptureDevice?”的值 必须解包为“AVCaptureDevice”类型的值
- python - 仅在所有元素为 0 的矩阵的第一行和第一列中添加元素
- c++ - 如何测试特定的 C++ 语句是否比其他语句更快或更慢?
- swift - 控制嵌套的 UITabController
- asp.net - vb.net 代码未在 asp.net 页面上运行
- azure-redis-cache - 线程“主”redis.clients.jedis.exceptions.JedisDataException 中的异常:ERR 密码无效
- azure - 无法断开 Azure 功能的持续部署
- c# - FluentValidation 不适用于外部模型对象的集合
- javascript - 如何使用 JSDOM 加载本地 JavaScript 文件?