歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android捕獲全局異常信息並實現上傳

Android捕獲全局異常信息並實現上傳

日期:2017/3/1 10:56:41   编辑:Linux編程

在做項目時,經常會把錯誤利用異常拋出去,這樣在開發時就可以通過手機拋出的異常排查錯誤。但是當程序開發完畢,版本穩定,需要上線時,為了避免拋出異常影響用戶感受,可以用UncaughtExceptionHandler捕獲全局異常,對異常做出處理。比如我們可以獲取到拋出異常的時間、手機的硬件信息、錯誤的堆棧信息,然後將獲取到的所有的信息發送到服務器中,也可以發送到指定的郵件中,以便及時修改bug。

示例:

自定義異常類實現UncaughtExceptionHandler接口,當某個頁面出現異常就會調用uncaughtException這個方法,我們可以在這個方法中獲取異常信息、時間等,然後將獲取到的信息發送到我們指定的服務器

  1. /**
  2. * 自定義的 異常處理類 , 實現了 UncaughtExceptionHandler接口
  3. * @author Administrator
  4. *
  5. */
  6. public class MyCrashHandler implements UncaughtExceptionHandler {
  7. // 需求是 整個應用程序 只有一個 MyCrash-Handler
  8. private static MyCrashHandler myCrashHandler ;
  9. private Context context;
  10. private DoubanService service;
  11. private SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
  12. //1.私有化構造方法
  13. private MyCrashHandler(){
  14. }
  15. public static synchronized MyCrashHandler getInstance(){
  16. if(myCrashHandler!=null){
  17. return myCrashHandler;
  18. }else {
  19. myCrashHandler = new MyCrashHandler();
  20. return myCrashHandler;
  21. }
  22. }
  23. public void init(Context context,DoubanService service){
  24. this.context = context;
  25. this.service = service;
  26. }
  27. public void uncaughtException(Thread arg0, Throwable arg1) {
  28. System.out.println("程序掛掉了 ");
  29. // 1.獲取當前程序的版本號. 版本的id
  30. String versioninfo = getVersionInfo();
  31. // 2.獲取手機的硬件信息.
  32. String mobileInfo = getMobileInfo();
  33. // 3.把錯誤的堆棧信息 獲取出來
  34. String errorinfo = getErrorInfo(arg1);
  35. // 4.把所有的信息 還有信息對應的時間 提交到服務器
  36. try {
  37. service.createNote(new PlainTextConstruct(dataFormat.format(new Date())),
  38. new PlainTextConstruct(versioninfo+mobileInfo+errorinfo), "public", "yes");
  39. } catch (Exception e) {
  40. e.printStackTrace();
  41. }
  42. //干掉當前的程序
  43. Android.os.Process.killProcess(android.os.Process.myPid());
  44. }
  45. /**
  46. * 獲取錯誤的信息
  47. * @param arg1
  48. * @return
  49. */
  50. private String getErrorInfo(Throwable arg1) {
  51. Writer writer = new StringWriter();
  52. PrintWriter pw = new PrintWriter(writer);
  53. arg1.printStackTrace(pw);
  54. pw.close();
  55. String error= writer.toString();
  56. return error;
  57. }
  58. /**
  59. * 獲取手機的硬件信息
  60. * @return
  61. */
  62. private String getMobileInfo() {
  63. StringBuffer sb = new StringBuffer();
  64. //通過反射獲取系統的硬件信息
  65. try {
  66. Field[] fields = Build.class.getDeclaredFields();
  67. for(Field field: fields){
  68. //暴力反射 ,獲取私有的信息
  69. field.setAccessible(true);
  70. String name = field.getName();
  71. String value = field.get(null).toString();
  72. sb.append(name+"="+value);
  73. sb.append("\n");
  74. }
  75. } catch (Exception e) {
  76. e.printStackTrace();
  77. }
  78. return sb.toString();
  79. }
  80. /**
  81. * 獲取手機的版本信息
  82. * @return
  83. */
  84. private String getVersionInfo(){
  85. try {
  86. PackageManager pm = context.getPackageManager();
  87. PackageInfo info =pm.getPackageInfo(context.getPackageName(), 0);
  88. return info.versionName;
  89. } catch (Exception e) {
  90. e.printStackTrace();
  91. return "版本號未知";
  92. }
  93. }
  94. }
Copyright © Linux教程網 All Rights Reserved