http://www.jianshu.com/p/5a1e3c0d2f73
<div class="note">
<div class="post">
<div class="article">
<h1 class="title">android中异常捕获</h1>
<!-- 作者区域 -->
<div class="author">
<a class="avatar" href="/u/14231f9b1a63">
<img src="http://upload.jianshu.io/users/upload_avatars/1301022/d501d045ac33.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/144/h/144" alt="144">
</a> <div class="info">
<span class="tag">作者</span>
<span class="name"><a href="/u/14231f9b1a63">杨枭</a></span>
<!-- 关注用户按钮 -->
<a class="btn btn-success follow"><i class="iconfont ic-follow"></i><span>关注</span></a>
<!-- 文章数据信息 -->
<div class="meta">
<!-- 如果文章更新时间大于发布时间,那么使用 tooltip 显示更新时间 -->
<span class="publish-time">2016.09.22 15:58</span>
<span class="wordage">字数 205</span>
<span class="views-count">阅读 37</span><span class="comments-count">评论 0</span><span class="likes-count">喜欢 2</span></div>
</div>
<!-- 如果是当前作者,加入编辑按钮 -->
</div>
<!-- -->
<!-- 文章内容 -->
<div class="show-content">
<p>刚做android开发的时候,经常会写出很多bug,特别是在测试的时候,如果遇到不能重现的bug,很多问题不好及时的定位。后面使用TestIn进行错误信息的统计,但是发现有时不能及时在后台查看。我就想,自己能不能做一个更testIn一样的功能。所以就有了下面的内容。</p>
<p>使用步骤:需要在application中进行配置</p>
<pre class="hljs java"><code class="java"> ExceptionHandler catchHandler = ExceptionHandler.getInstance();
catchHandler.init(getApplicationContext());
catchHandler.collectDeviceInfo(getApplicationContext());</code></pre>
<p>具体的实现代码如下:</p>
<pre class="hljs java"><code class="java"><span class="hljs-keyword">package</span> ex.yh.cn.exdemo;
<span class="hljs-keyword">import</span> android.content.Context;
<span class="hljs-keyword">import</span> android.content.pm.PackageInfo;
<span class="hljs-keyword">import</span> android.content.pm.PackageManager;
<span class="hljs-keyword">import</span> android.content.pm.PackageManager.NameNotFoundException;
<span class="hljs-keyword">import</span> android.os.Build;
<span class="hljs-keyword">import</span> android.os.Environment;
<span class="hljs-keyword">import</span> android.os.Looper;
<span class="hljs-keyword">import</span> android.util.Log;
<span class="hljs-keyword">import</span> android.widget.Toast;
<span class="hljs-keyword">import</span> java.io.BufferedReader;
<span class="hljs-keyword">import</span> java.io.File;
<span class="hljs-keyword">import</span> java.io.FileInputStream;
<span class="hljs-keyword">import</span> java.io.FileNotFoundException;
<span class="hljs-keyword">import</span> java.io.FileOutputStream;
<span class="hljs-keyword">import</span> java.io.IOException;
<span class="hljs-keyword">import</span> java.io.InputStreamReader;
<span class="hljs-keyword">import</span> java.io.OutputStream;
<span class="hljs-keyword">import</span> java.io.PrintWriter;
<span class="hljs-keyword">import</span> java.io.StringWriter;
<span class="hljs-keyword">import</span> java.io.Writer;
<span class="hljs-keyword">import</span> java.lang.Thread.UncaughtExceptionHandler;
<span class="hljs-keyword">import</span> java.lang.reflect.Field;
<span class="hljs-keyword">import</span> java.text.SimpleDateFormat;
<span class="hljs-keyword">import</span> java.util.Date;
<span class="hljs-keyword">import</span> java.util.HashMap;
<span class="hljs-keyword">import</span> java.util.Map;
<span class="hljs-comment">/**
* 全局异常捕获
*
* <span class="hljs-doctag">@author</span> yanghai
* 该类将发生异常的日志信息写在本地目录中,
* 使用时,需要在Application中进行初始化的配置
* <p>
* ExceptionHandler catchHandler = ExceptionHandler.getInstance();
* catchHandler.init(getApplicationContext());
* catchHandler.collectDeviceInfo(getApplicationContext());
* </p>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExceptionHandler</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">UncaughtExceptionHandler</span> </span>{
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String TAG = <span class="hljs-string">"CrashHandler"</span>;
<span class="hljs-comment">// 系统默认的UncaughtException处理类</span>
<span class="hljs-keyword">private</span> UncaughtExceptionHandler mDefaultHandler;
<span class="hljs-comment">// CrashHandler实例</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> ExceptionHandler instance;
<span class="hljs-comment">// 程序的Context对象</span>
<span class="hljs-keyword">private</span> Context mContext;
<span class="hljs-comment">// 用来存储设备信息和异常信息</span>
<span class="hljs-keyword">private</span> Map<String, String> infos = <span class="hljs-keyword">new</span> HashMap<String, String>();
<span class="hljs-comment">// 用于格式化日期,作为日志文件名的一部分</span>
<span class="hljs-comment">/**
* 保证只有一个CrashHandler实例
*/</span>
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-title">ExceptionHandler</span><span class="hljs-params">()</span> </span>{
}
<span class="hljs-comment">/**
* 获取CrashHandler实例 ,单例模式
*/</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> ExceptionHandler <span class="hljs-title">getInstance</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">if</span> (instance == <span class="hljs-keyword">null</span>)
instance = <span class="hljs-keyword">new</span> ExceptionHandler();
<span class="hljs-keyword">return</span> instance;
}
<span class="hljs-comment">/**
* 初始化
*/</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">init</span><span class="hljs-params">(Context context)</span> </span>{
mContext = context;
<span class="hljs-comment">// 获取系统默认的UncaughtException处理器</span>
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
<span class="hljs-comment">// 设置该CrashHandler为程序的默认处理器</span>
Thread.setDefaultUncaughtExceptionHandler(<span class="hljs-keyword">this</span>);
}
<span class="hljs-comment">/**
* 当UncaughtException发生时会转入该函数来处理
*/</span>
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">uncaughtException</span><span class="hljs-params">(Thread thread, Throwable ex)</span> </span>{
<span class="hljs-keyword">if</span> (!handleException(ex) && mDefaultHandler != <span class="hljs-keyword">null</span>) {
<span class="hljs-comment">// 如果用户没有处理则让系统默认的异常处理器来处理</span>
mDefaultHandler.uncaughtException(thread, ex);
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">try</span> {
Thread.sleep(<span class="hljs-number">3000</span>);
} <span class="hljs-keyword">catch</span> (InterruptedException e) {
Log.e(TAG, <span class="hljs-string">"error : "</span>, e);
}
<span class="hljs-comment">// 退出程序</span>
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(<span class="hljs-number">1</span>);
}
}
<span class="hljs-comment">/**
* 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
*
* <span class="hljs-doctag">@param</span> ex
* <span class="hljs-doctag">@return</span> true:如果处理了该异常信息;否则返回false.
*/</span>
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">handleException</span><span class="hljs-params">(Throwable ex)</span> </span>{
<span class="hljs-keyword">if</span> (ex == <span class="hljs-keyword">null</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
}
<span class="hljs-comment">// 收集设备参数信息</span>
collectDeviceInfo(mContext);
<span class="hljs-comment">// 使用Toast来显示异常信息</span>
<span class="hljs-keyword">new</span> Thread() {
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span> </span>{
Looper.prepare();
Toast.makeText(mContext, <span class="hljs-string">"很抱歉,程序出现异常,即将退出.错误信息保存在该目录"</span> + getSDPath(),
Toast.LENGTH_SHORT).show();
Looper.loop();
}
}.start();
<span class="hljs-comment">// 保存日志文件</span>
saveCatchInfo2File(ex);
<span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
}
<span class="hljs-comment">/**
* 收集设备参数信息
*
* <span class="hljs-doctag">@param</span> ctx
*/</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">collectDeviceInfo</span><span class="hljs-params">(Context ctx)</span> </span>{
Log.i(TAG, <span class="hljs-string">"收集设备信息"</span>);
<span class="hljs-keyword">try</span> {
PackageManager pm = ctx.getPackageManager();
PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(),
PackageManager.GET_ACTIVITIES);
<span class="hljs-keyword">if</span> (pi != <span class="hljs-keyword">null</span>) {
infos.put(<span class="hljs-string">"versionName"</span>, String.valueOf(pi.versionName == <span class="hljs-keyword">null</span> ? <span class="hljs-string">"null"</span>
: pi.versionName));
infos.put(<span class="hljs-string">"versionCode"</span>, String.valueOf(pi.versionCode));
}
} <span class="hljs-keyword">catch</span> (NameNotFoundException e) {
Log.e(TAG, <span class="hljs-string">"an error occured when collect package info"</span>, e);
}
Field[] fields = Build.class.getDeclaredFields();
<span class="hljs-keyword">for</span> (Field field : fields) {
<span class="hljs-keyword">try</span> {
field.setAccessible(<span class="hljs-keyword">true</span>);
infos.put(field.getName(), field.get(<span class="hljs-keyword">null</span>).toString());
Log.d(TAG, field.getName() + <span class="hljs-string">" : "</span> + field.get(<span class="hljs-keyword">null</span>));
} <span class="hljs-keyword">catch</span> (Exception e) {
Log.e(TAG, <span class="hljs-string">"an error occured when collect crash info"</span>, e);
}
}
}
<span class="hljs-comment">/**
* 保存错误信息到文件中
*
* <span class="hljs-doctag">@param</span> ex
* <span class="hljs-doctag">@return</span> 返回文件名称, 便于将文件传送到服务器
*/</span>
<span class="hljs-function"><span class="hljs-keyword">private</span> String <span class="hljs-title">saveCatchInfo2File</span><span class="hljs-params">(Throwable ex)</span> </span>{
OutputStream fos = <span class="hljs-keyword">null</span>;
StringBuffer sb = <span class="hljs-keyword">new</span> StringBuffer();
<span class="hljs-keyword">for</span> (Map.Entry<String, String> entry : infos.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
sb.append(key + <span class="hljs-string">"="</span> + value + <span class="hljs-string">"\n"</span>);
}
Writer writer = <span class="hljs-keyword">new</span> StringWriter();
PrintWriter printWriter = <span class="hljs-keyword">new</span> PrintWriter(writer);
ex.printStackTrace(printWriter);
Throwable cause = ex.getCause();
<span class="hljs-keyword">while</span> (cause != <span class="hljs-keyword">null</span>) {
cause.printStackTrace(printWriter);
cause = cause.getCause();
}
printWriter.close();
String result = writer.toString();
sb.append(result);
<span class="hljs-keyword">try</span> {
String fileName = <span class="hljs-string">"crash-"</span> + getCurrentTime() + <span class="hljs-string">".txt"</span>;
<span class="hljs-keyword">if</span> (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
String path = getSDPath() + <span class="hljs-string">"/"</span> + BuildConfig.APPLICATION_ID + <span class="hljs-string">"/exception/"</span>;
File dir = <span class="hljs-keyword">new</span> File(path);
<span class="hljs-keyword">if</span> (!dir.exists()) {
<span class="hljs-comment">// 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。</span>
dir.mkdirs();
}
String fileAddress = path + fileName;
File exFile = <span class="hljs-keyword">new</span> File(fileAddress);
<span class="hljs-keyword">if</span> (!exFile.exists()) {
exFile.createNewFile();
}
fos = <span class="hljs-keyword">new</span> FileOutputStream(exFile);
fos.write(sb.toString().getBytes());
<span class="hljs-comment">// 发送给开发人员</span>
sendCrashLog2PM(path + fileName);
fos.close();
}
<span class="hljs-keyword">return</span> fileName;
} <span class="hljs-keyword">catch</span> (Exception e) {
Log.e(TAG, <span class="hljs-string">"an error occured while writing file..."</span>, e);
} <span class="hljs-keyword">finally</span> {
<span class="hljs-keyword">if</span> (fos != <span class="hljs-keyword">null</span>) {
<span class="hljs-keyword">try</span> {
fos.close();
} <span class="hljs-keyword">catch</span> (IOException e) {
e.printStackTrace();
}
}
}
<span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
}
<span class="hljs-comment">/**
* 将捕获的导致崩溃的错误信息发送给开发人员
* <p/>
* 目前只将log日志保存在sdcard 和输出到LogCat中,并未发送给后台。
*/</span>
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sendCrashLog2PM</span><span class="hljs-params">(String fileName)</span> </span>{
<span class="hljs-keyword">if</span> (!<span class="hljs-keyword">new</span> File(fileName).exists()) {
Toast.makeText(mContext, <span class="hljs-string">"日志文件不存在!"</span>, Toast.LENGTH_SHORT).show();
<span class="hljs-keyword">return</span>;
}
FileInputStream fis = <span class="hljs-keyword">null</span>;
BufferedReader reader = <span class="hljs-keyword">null</span>;
String s = <span class="hljs-keyword">null</span>;
<span class="hljs-keyword">try</span> {
fis = <span class="hljs-keyword">new</span> FileInputStream(fileName);
reader = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(fis, <span class="hljs-string">"GBK"</span>));
<span class="hljs-keyword">while</span> (<span class="hljs-keyword">true</span>) {
s = reader.readLine();
<span class="hljs-keyword">if</span> (s == <span class="hljs-keyword">null</span>)
<span class="hljs-keyword">break</span>;
<span class="hljs-comment">// 由于目前尚未确定以何种方式发送,所以先打出log日志。</span>
Log.i(<span class="hljs-string">"info"</span>, s.toString());
}
} <span class="hljs-keyword">catch</span> (FileNotFoundException e) {
e.printStackTrace();
} <span class="hljs-keyword">catch</span> (IOException e) {
e.printStackTrace();
} <span class="hljs-keyword">finally</span> { <span class="hljs-comment">// 取消流</span>
<span class="hljs-keyword">try</span> {
reader.close();
fis.close();
} <span class="hljs-keyword">catch</span> (IOException e) {
e.printStackTrace();
}
}
}
<span class="hljs-comment">// 获得sd卡的根目录</span>
<span class="hljs-function"><span class="hljs-keyword">private</span> String <span class="hljs-title">getSDPath</span><span class="hljs-params">()</span> </span>{
File sdDir = <span class="hljs-keyword">null</span>;
<span class="hljs-keyword">boolean</span> sdCardExist = Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
<span class="hljs-comment">// 判断sd卡是否存在</span>
<span class="hljs-keyword">if</span> (sdCardExist) {
sdDir = Environment.getExternalStorageDirectory();<span class="hljs-comment">// 获取跟目录</span>
}
<span class="hljs-keyword">return</span> sdDir.toString();
}
<span class="hljs-function"><span class="hljs-keyword">private</span> String <span class="hljs-title">getCurrentTime</span><span class="hljs-params">()</span> </span>{
SimpleDateFormat format = <span class="hljs-keyword">new</span> SimpleDateFormat(<span class="hljs-string">"yyyy-MM-hh-mm:ss"</span>);
<span class="hljs-keyword">return</span> format.format(<span class="hljs-keyword">new</span> Date());
}
}</code></pre>
<p>注意:错误信息会保存在sd卡上以改程序applicationId命名的包中<br><a href="https://github.com/yhaccount/exdemo" target="_blank">demo地址</a></p>
<p>我始终相信,只要能想到的功能,都能实现。不要因为自己的能力不够,而找出奇葩的借口。</p>
</div>
<!-- -->
<div class="show-foot">
<a class="notebook" href="/nb/2650757">
<i class="iconfont ic-search-notebook"></i> <span>零散知识</span>
</a> <div class="copyright" data-toggle="tooltip" data-html="true" data-original-title="转载请联系作者获得授权,并标注“简书作者”。">
© 著作权归作者所有
</div>
<div class="modal-wrap" data-report-note="">
<a id="report-modal">举报文章</a>
</div>
</div>
</div>
<!-- 文章底部作者信息 -->
<div class="follow-detail">
<div class="info">
<a class="avatar" href="/u/14231f9b1a63">
<img src="http://upload.jianshu.io/users/upload_avatars/1301022/d501d045ac33.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/144/h/144" alt="144">
</a> <a class="btn btn-success follow"><i class="iconfont ic-follow"></i><span>关注</span></a>
<a class="title" href="/u/14231f9b1a63">杨枭</a>
<p>写了 1941 字,被 4 人关注,获得了 5 个喜欢</p></div>
<div class="signature">
<span>失败只有一种,那就是半途而废。</span>
</div>
</div>
<div class="meta-bottom">
<div class="like"><div class="btn like-group"><div class="btn-like"><a><i class="iconfont ic-like"></i>喜欢</a></div> <div class="modal-wrap"><a>2</a></div></div> <!----></div>
<div class="share-group">
<a class="share-circle" data-action="weixin-share" data-toggle="tooltip" data-original-title="分享到微信">
<i class="iconfont ic-wechat"></i>
</a>
<a class="share-circle" data-toggle="tooltip" href="javascript:void((function(s,d,e,r,l,p,t,z,c){var%20f='http://v.t.sina.com.cn/share/share.php?appkey=1881139527',u=z||d.location,p=['&url=',e(u),'&title=',e(t||d.title),'&source=',e(r),'&sourceUrl=',e(l),'&content=',c||'gb2312','&pic=',e(p||'')].join('');function%20a(){if(!window.open([f,p].join(''),'mb',['toolbar=0,status=0,resizable=1,width=440,height=430,left=',(s.width-440)/2,',top=',(s.height-430)/2].join('')))u.href=[f,p].join('');};if(/Firefox/.test(navigator.userAgent))setTimeout(a,0);else%20a();})(screen,document,encodeURIComponent,'','','http://cwb.assets.jianshu.io/notes/images/5931969/weibo/image_3b052dc7ace8.jpg', '推荐 杨枭 的文章《android中异常捕获》( 分享自 @简书 )','http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weibo','页面编码gb2312|utf-8默认gb2312'));" data-original-title="分享到微博">
<i class="iconfont ic-weibo"></i>
</a>
<a class="share-circle" data-toggle="tooltip" href="http://cwb.assets.jianshu.io/notes/images/5931969/weibo/image_3b052dc7ace8.jpg" target="_blank" data-original-title="下载长微博图片">
<i class="iconfont ic-picture"></i>
</a>
<a class="share-circle more-share" tabindex="0" data-toggle="popover" data-placement="top" data-html="true" data-trigger="focus" href="javascript:void(0);" data-content="
<ul class="share-list">
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url='+e('http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=qzone')+'&title='+e('推荐 杨枭 的文章《android中异常捕获》'),x=function(){if(!window.open(r,'qzone','toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class="social-icon-sprite social-icon-zone"></i><span>分享到QQ空间</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='https://twitter.com/share?url='+e('http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=twitter')+'&text='+e('推荐 杨枭 的文章《android中异常捕获》( 分享自 @jianshucom )')+'&related='+e('jianshucom'),x=function(){if(!window.open(r,'twitter','toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class="social-icon-sprite social-icon-twitter"></i><span>分享到Twitter</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='https://www.facebook.com/dialog/share?app_id=483126645039390&display=popup&href=http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=facebook',x=function(){if(!window.open(r,'facebook','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class="social-icon-sprite social-icon-facebook"></i><span>分享到Facebook</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='https://plus.google.com/share?url='+e('http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=google_plus'),x=function(){if(!window.open(r,'google_plus','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class="social-icon-sprite social-icon-google"></i><span>分享到Google+</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,s1=window.getSelection,s2=d.getSelection,s3=d.selection,s=s1?s1():s2?s2():s3?s3.createRange().text:'',r='http://www.douban.com/recommend/?url='+e('http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=douban')+'&title='+e('android中异常捕获')+'&sel='+e(s)+'&v=1',x=function(){if(!window.open(r,'douban','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r+'&r=1'};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})()"><i class="social-icon-sprite social-icon-douban"></i><span>分享到豆瓣</span></a></li>
</ul>
" data-original-title="" title="">更多分享</a>
</div>
</div>
<div><div id="comment-list" class="comment-list"><div><form class="new-comment"><a class="avatar"><img src="http://upload.jianshu.io/users/upload_avatars/4130372/85be02ba5e64.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114"></a> <textarea placeholder="写下你的评论..."></textarea> <!----></form></div> <div id="normal-comment-list" class="normal-comment-list"><div><!----> <div><div class="top"><span>评论</span> <a class="close-btn" style="display: none;">关闭评论</a></div> <div class="no-comment"></div> <div class="text">
智慧如你,不想<a>发表一点想法</a>咩~
</div></div> <!----> <div class="comments-placeholder" style="display: none;"><div class="author"><div class="avatar"></div> <div class="info"><div class="name"></div> <div class="meta"></div></div></div> <div class="text"></div> <div class="text animation-delay"></div> <div class="tool-group"><i class="iconfont ic-zan-active"></i><div class="zan"></div> <i class="iconfont ic-list-comments"></i><div class="zan"></div></div></div></div></div> <!----> <!----></div></div>
</div>
<div class="side-tool"><ul><li data-placement="left" data-toggle="tooltip" data-container="body" data-original-title="回到顶部" style="display: none;"><a href="#" class="function-button"><i class="iconfont ic-backtop"></i></a></li> <li data-placement="left" data-toggle="tooltip" data-container="body" data-original-title="将文章加入专题"><a class="js-submit-button"><i class="iconfont ic-addcollectionmodal"></i></a> <!----></li> <li data-placement="left" data-toggle="tooltip" data-container="body" data-original-title="收藏文章"><a class="function-button"><i class="iconfont ic-mark"></i></a></li> <li data-placement="left" data-toggle="tooltip" data-container="body" data-original-title="分享文章"><a tabindex="0" role="button" data-toggle="popover" data-placement="left" data-html="true" data-trigger="focus" href="javascript:void(0);" data-content="<ul class='share-list'>
<li><a class="weixin-share"><i class="social-icon-sprite social-icon-weixin"></i><span>分享到微信</span></a></li>
<li><a href="javascript:void((function(s,d,e,r,l,p,t,z,c){var%20f='http://v.t.sina.com.cn/share/share.php?appkey=1881139527',u=z||d.location,p=['&url=',e(u),'&title=',e(t||d.title),'&source=',e(r),'&sourceUrl=',e(l),'&content=',c||'gb2312','&pic=',e(p||'')].join('');function%20a(){if(!window.open([f,p].join(''),'mb',['toolbar=0,status=0,resizable=1,width=440,height=430,left=',(s.width-440)/2,',top=',(s.height-430)/2].join('')))u.href=[f,p].join('');};if(/Firefox/.test(navigator.userAgent))setTimeout(a,0);else%20a();})(screen,document,encodeURIComponent,'','','http://cwb.assets.jianshu.io/notes/images/5931969/weibo/image_3b052dc7ace8.jpg', '推荐 杨枭 的文章《android中异常捕获》( 分享自 @简书 )','http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weibo','页面编码gb2312|utf-8默认gb2312'));"><i class='social-icon-sprite social-icon-weibo'></i><span>分享到微博</span></a></li>
<li><a href="http://cwb.assets.jianshu.io/notes/images/5931969/weibo/image_3b052dc7ace8.jpg" target="_blank"><i class="social-icon-sprite social-icon-picture"></i><span>下载长微博图片</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url='+e('http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=qzone')+'&title='+e('推荐 杨枭 的文章《android中异常捕获》'),x=function(){if(!window.open(r,'qzone','toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class='social-icon-sprite social-icon-zone'></i><span>分享到QQ空间</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='https://twitter.com/share?url='+e('http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=twitter')+'&text='+e('推荐 杨枭 的文章《android中异常捕获》( 分享自 @jianshucom )')+'&related='+e('jianshucom'),x=function(){if(!window.open(r,'twitter','toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class='social-icon-sprite social-icon-twitter'></i><span>分享到Twitter</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='https://www.facebook.com/dialog/share?app_id=483126645039390&display=popup&href=http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=facebook',x=function(){if(!window.open(r,'facebook','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class='social-icon-sprite social-icon-facebook'></i><span>分享到Facebook</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='https://plus.google.com/share?url='+e('http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=google_plus'),x=function(){if(!window.open(r,'google_plus','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class='social-icon-sprite social-icon-google'></i><span>分享到Google+</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,s1=window.getSelection,s2=d.getSelection,s3=d.selection,s=s1?s1():s2?s2():s3?s3.createRange().text:'',r='http://www.douban.com/recommend/?url='+e('http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=douban')+'&title='+e('android中异常捕获')+'&sel='+e(s)+'&v=1',x=function(){if(!window.open(r,'douban','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r+'&r=1'};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})()"><i class='social-icon-sprite social-icon-douban'></i><span>分享到豆瓣</span></a></li>
</ul>" data-original-title="" title="" class="function-button"><i class="iconfont ic-share"></i></a> <!----></li></ul></div>
</div>