Android捕获全局异常信息并实现上传
上一篇 /
下一篇 2012-04-11 09:31:47
/ 个人分类:杂谈
在做项目时,经常会把错误利用异常抛出去,这样在开发时就可以通过
手机抛出的异常排查错误。但是当程序开发完毕,版本稳定,需要上线时,为了避免抛出异常影响用户感受,可以用UncaughtExceptionHandler捕获全局异常,对异常做出处理。比如我们可以获取到抛出异常的时间、手机的硬件信息、错误的堆栈信息,然后将获取到的所有的信息发送到服务器中,也可以发送到指定的邮件中,以便及时修改bug。
w EB.QEu0 示例:51Testing软件测试网'Z5pE9F"?"Qr
zk,dZVx
d0 自定义异常类实现UncaughtExceptionHandler接口,当某个页面出现异常就会调用uncaughtException这个方法,我们可以在这个方法中获取异常信息、时间等,然后将获取到的信息发送到我们指定的服务器
+[
K"rV b;V.R9xACG051Testing软件测试网 EoD k;e zvbafo~051Testing软件测试网ql/P-o,U${k?&C /**51Testing软件测试网k3E0t}\/H * 自定义的 异常处理类 , 实现了 UncaughtExceptionHandler接口51Testing软件测试网]2[7w%qu$P/[ * @author Administrator51Testing软件测试网IS&mnR9i1O5Sf *51Testing软件测试网e9{ZcH}(Y\j(x */ iSh ~Ma\8^N:{0public class MyCrashHandler implements UncaughtExceptionHandler { Ng(n-xb#oC9e+a0 // 需求是 整个应用程序 只有一个 MyCrash-Handler &AlIN8i(w#DbK;@%Z0 private static MyCrashHandler myCrashHandler ;51Testing软件测试网Ai$oB n'r|U private Context context; 4vrs0Mm0 private DoubanService service; k;goju8|u6cm0 private SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");51Testing软件测试网 {'Z9Iy'VC {,A 51Testing软件测试网pEt!KjC`;j_&n //1.私有化构造方法
g]
k@,E^-?!E$c0 private MyCrashHandler(){ QNL#K3X7CrL0 51Testing软件测试网aYE(fK${1ACILp }51Testing软件测试网.W T([M'{"Fu qF-}~~
Xn\c0 public static synchronized MyCrashHandler getInstance(){ o}&AkQ2q6]
]0 if(myCrashHandler!=null){ Xk;I2P$E1W*q"p o0 return myCrashHandler;51Testing软件测试网s#whP%x8k8y }else { -r0P+P ~ \v-R0 myCrashHandler = new MyCrashHandler();51Testing软件测试网F*R#xa;U1kaZ'eW-c return myCrashHandler; p|3ak(K)} uT0 }51Testing软件测试网T-mb wT;_H(r }51Testing软件测试网!@2j_3\.a public void init(Context context,DoubanService service){51Testing软件测试网T2P%D;s8O8L/TR this.context = context; 9F2Pj&oa!b;Ny0 this.service = service;51Testing软件测试网
y5` Q.q L2c;E }51Testing软件测试网/| wh3qN&GP %\(N$k%bh.B0-Y~ j+Uy0y2\0 public void uncaughtException(Thread arg0, Throwable arg1) {51Testing软件测试网te#G1gS'Xo0`^ System.out.println("程序挂掉了 "); .Ta+z$b[%t,bS7P7J0 // 1.获取当前程序的版本号. 版本的id51Testing软件测试网
F2k}q
g ^W String versioninfo = getVersionInfo();51Testing软件测试网@#X*u(f3P6OJ^3`
[ 51Testing软件测试网EIL3]H.h*a // 2.获取手机的硬件信息. (G9d d2G1Z[j;I0 String mobileInfo = getMobileInfo(); Mxh0Eux(q1c}0 51Testing软件测试网+I7l2B1Ar{f&@ // 3.把错误的堆栈信息 获取出来 tP:OB7Q2qI-O1Y.}0 String errorinfo = getErrorInfo(arg1);51Testing软件测试网n%O_
\
j,P5a 51Testing软件测试网
g
} h/H{[3Y;@X // 4.把所有的信息 还有信息对应的时间 提交到服务器 b5l~1@,A}$u?0 try { 3Uq!x k6DN}M0 service.createNote(new PlainTextConstruct(dataFormat.format(new Date())), \\3h)d
vr&b0 new PlainTextConstruct(versioninfo+mobileInfo+errorinfo), "public", "yes");
C"U?I!V:KiZ0 } catch (Exception e) {51Testing软件测试网
Q/v;vyz0sn H5C z e.printStackTrace(); \tr'Ob8m0 } (o7BdO^ ~B$O|$Q0 ,j8xK,x Mj2q2x0 //干掉当前的程序51Testing软件测试网,a;Ypni ];M%` r android.os.Process.killProcess(android.os.Process.myPid());51Testing软件测试网Pz8N/C6Qh|S?N8JT } 6{#jxQe5M
X08}MkI}k0 /**51Testing软件测试网3w9RIP7gv * 获取错误的信息51Testing软件测试网L|'l5ie * @param arg1 4G}U*vF1B:Oq0 * @return .w4{:HB-s&i3Y`d8k0 */51Testing软件测试网k6CC-iUkF private String getErrorInfo(Throwable arg1) { VE&}%ukv6G0 Writer writer = new StringWriter(); %O\0x&]
Ls%fq0 PrintWriter pw = new PrintWriter(writer); g7}^[Q4k%r)KW_0 arg1.printStackTrace(pw); +D&?(~:RzIW(_0 pw.close(); c_BP'Y'k0ya0 String error= writer.toString();51Testing软件测试网S%aXq(I return error; @PN,kX`5Z0 }51Testing软件测试网4oa5S
z t%I_y:d$c 51Testing软件测试网Hp(|RyT |-S /** *q:g |T5^0 * 获取手机的硬件信息 *@'uU!sQh(oo&G8q7_0 * @return51Testing软件测试网5us+F)mK9fd */ +k[ Z/Hx~#R0 private String getMobileInfo() {51Testing软件测试网B~9F@+Z sq$DI-z?f StringBuffer sb = new StringBuffer(); 6MTF&Yd,l.X0 //通过反射获取系统的硬件信息51Testing软件测试网lR7C}?Gs try { Fi_z mq;qt051Testing软件测试网0~f'L(`6x1k4T Field[] fields = Build.class.getDeclaredFields(); 2Ug3IJ^r
{+q0 for(Field field: fields){ +F6[Z#g*[LL{_0 //暴力反射 ,获取私有的信息51Testing软件测试网R3@(_'B9gs@&M'v field.setAccessible(true);51Testing软件测试网&Sh]bk&D String name = field.getName(); |eBya"_`2j9Q^0 String value = field.get(null).toString(); /_O6M:i^V:O p5v0 sb.append(name+"="+value);51Testing软件测试网T&R[snB sb.append("\n"); x$F2rgz6f(Li0 }51Testing软件测试网#h0Cy/PZ4Cin } catch (Exception e) { {n$]7OIHJ?$k!Lr0 e.printStackTrace();51Testing软件测试网k&L
a i/l }51Testing软件测试网9A
}qw@6m [ return sb.toString(); 'spqCg(D6_0 }51Testing软件测试网|9__N4R-^ #S0Q\uW{0 /**
|