程序员最头疼的事情就是bug和debug。此次debug长达20天,搞的我心力交瘁。累,由于Android兼容性,不一样手机会有不一样的bug出来,并且很难复现,因此就上网找了下相似保存错误log到文件再上传到服务器,现把源码也共享出来。上传至服务器的代码我没加。相信你们都有现成的代码了。 html
先讲下原理,跟JavaEE的自定义异常捕获同样,将错误一直向上抛,而后在最上层统一处理。这里就能够得到Exception Message,进行保存操做 android
异常捕获类以下: 程序员
/**} 服务器
在Application onCreate时就注册ExceptionHandler,此后只要程序在抛异常后就能捕获到。 并发
public class Appextends Application{
@Override
public void onCreate() {
super.onCreate();
CrashHandler crashHandler = CrashHandler.getInstance();
//注册crashHandler
crashHandler.init(getApplicationContext());
}
}
|
public class LogActivityextends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {//制造bug
File file =new File(Environment.getExternalStorageState() ,"crash.bin");
FileInputStream fis =new FileInputStream(file);
byte[] buffer =new byte[1024];
fis.read(buffer);
}catch (Exception e) {
//这里不能再向上抛异常,若是想要将log信息保存起来,则抛出runtime异常,
// 让自定义的handler来捕获,统一将文件保存起来上传
throw new RuntimeException(e);
}
}
}
|
注意,若是catch后不throw就默认是本身处理了,ExceptionHandler不会捕获异常了。 app
再分享一个Log的封装类,只要在这里设置DEBUG的值就能让控制台是否打印出log ide
public class DebugUtil {
public static final String TAG ="ICON";
public static final boolean DEBUG =true;
public static void toast(Context context,String content){
Toast.makeText(context, content, Toast.LENGTH_SHORT).show();
}
public static void debug(String tag,String msg){
if (DEBUG) {
Log.d(tag, msg);
}
}
public static void debug(String msg){
if (DEBUG) {
Log.d(TAG, msg);
}
}
public static void error(String tag,String error){
Log.e(tag, error);
}
public static void error(String error){
Log.e(TAG, error);
}
}
|