android中异常捕获

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中进行初始化的配置
 *         &lt;p&gt;
 *         ExceptionHandler catchHandler = ExceptionHandler.getInstance();
 *         catchHandler.init(getApplicationContext());
 *         catchHandler.collectDeviceInfo(getApplicationContext());
 *         &lt;/p&gt;
 */</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&lt;String, String&gt; infos = <span class="hljs-keyword">new</span> HashMap&lt;String, String&gt;();


    <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) &amp;&amp; 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&lt;String, String&gt; 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">/**
     * 将捕获的导致崩溃的错误信息发送给开发人员
     * &lt;p/&gt;
     * 目前只将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=['&amp;url=',e(u),'&amp;title=',e(t||d.title),'&amp;source=',e(r),'&amp;sourceUrl=',e(l),'&amp;content=',c||'gb2312','&amp;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&amp;utm_content=note&amp;utm_medium=reader_share&amp;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=&quot;share-list&quot;>
            <li><a href=&quot;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&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=qzone')+'&amp;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()}})();&quot;><i class=&quot;social-icon-sprite social-icon-zone&quot;></i><span>分享到QQ空间</span></a></li>
            <li><a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r='https://twitter.com/share?url='+e('http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=twitter')+'&amp;text='+e('推荐 杨枭 的文章《android中异常捕获》( 分享自 @jianshucom )')+'&amp;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()}})();&quot;><i class=&quot;social-icon-sprite social-icon-twitter&quot;></i><span>分享到Twitter</span></a></li>
            <li><a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r='https://www.facebook.com/dialog/share?app_id=483126645039390&amp;display=popup&amp;href=http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;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()}})();&quot;><i class=&quot;social-icon-sprite social-icon-facebook&quot;></i><span>分享到Facebook</span></a></li>
            <li><a href=&quot;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&amp;utm_content=note&amp;utm_medium=reader_share&amp;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()}})();&quot;><i class=&quot;social-icon-sprite social-icon-google&quot;></i><span>分享到Google+</span></a></li>
            <li><a href=&quot;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&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=douban')+'&amp;title='+e('android中异常捕获')+'&amp;sel='+e(s)+'&amp;v=1',x=function(){if(!window.open(r,'douban','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r+'&amp;r=1'};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})()&quot;><i class=&quot;social-icon-sprite social-icon-douban&quot;></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=&quot;weixin-share&quot;><i class=&quot;social-icon-sprite social-icon-weixin&quot;></i><span>分享到微信</span></a></li>
                <li><a href=&quot;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=['&amp;url=',e(u),'&amp;title=',e(t||d.title),'&amp;source=',e(r),'&amp;sourceUrl=',e(l),'&amp;content=',c||'gb2312','&amp;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&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=weibo','页面编码gb2312|utf-8默认gb2312'));&quot;><i class='social-icon-sprite social-icon-weibo'></i><span>分享到微博</span></a></li>
                <li><a href=&quot;http://cwb.assets.jianshu.io/notes/images/5931969/weibo/image_3b052dc7ace8.jpg&quot; target=&quot;_blank&quot;><i class=&quot;social-icon-sprite social-icon-picture&quot;></i><span>下载长微博图片</span></a></li>
                <li><a href=&quot;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&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=qzone')+'&amp;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()}})();&quot;><i class='social-icon-sprite social-icon-zone'></i><span>分享到QQ空间</span></a></li>
                <li><a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r='https://twitter.com/share?url='+e('http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=twitter')+'&amp;text='+e('推荐 杨枭 的文章《android中异常捕获》( 分享自 @jianshucom )')+'&amp;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()}})();&quot;><i class='social-icon-sprite social-icon-twitter'></i><span>分享到Twitter</span></a></li>
                <li><a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r='https://www.facebook.com/dialog/share?app_id=483126645039390&amp;display=popup&amp;href=http://www.jianshu.com/p/5a1e3c0d2f73?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;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()}})();&quot;><i class='social-icon-sprite social-icon-facebook'></i><span>分享到Facebook</span></a></li>
                <li><a href=&quot;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&amp;utm_content=note&amp;utm_medium=reader_share&amp;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()}})();&quot;><i class='social-icon-sprite social-icon-google'></i><span>分享到Google+</span></a></li>
                <li><a href=&quot;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&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=douban')+'&amp;title='+e('android中异常捕获')+'&amp;sel='+e(s)+'&amp;v=1',x=function(){if(!window.open(r,'douban','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r+'&amp;r=1'};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})()&quot;><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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值