android 全局异常的捕获,保存本地以及上传服务器

简介:

android在产品上线以后为了能够实时捕获异常,需要写一个异常捕获的类,这个类在你遇到异常的时候会执行uncaughtException这个方法,然后你就可以对异常进行一些操作。

我把代码贴上来:

package com.example.spanable_textview;


import java.io.File;
import java.io.FileOutputStream;
import java.lang.Thread.UncaughtExceptionHandler;


import android.content.Context;
import android.os.Environment;
import android.os.Looper;


public class CrashException implements UncaughtExceptionHandler{


  /** 是否开启日志输出,在Debug状态下开启, 
     * 在Release状态下关闭以提示程序性能 
     * */ 
    public static final boolean DEBUG = true;  
    /** 系统默认的UncaughtException处理类 */ 
    private Thread.UncaughtExceptionHandler mDefaultHandler;  
    /** CrashHandler实例 */ 
    private static CrashException INSTANCE;  
    /** 程序的Context对象 */ 
//    private Context mContext;  
    /** 保证只有一个CrashHandler实例 */ 
    private CrashException() {}  
    /** 获取CrashHandler实例 ,单例模式*/ 

    
    public static CrashException getInstance(){
   
   
    if (INSTANCE==null) {
INSTANCE  =new CrashException();
}
   
    return INSTANCE;
    }
    
    
    /** 
     * 初始化,注册Context对象, 
     * 获取系统默认的UncaughtException处理器, 
     * 设置该CrashHandler为程序的默认处理器 
     *  
     * @param context 
     */ 
    
    
    public void init(Context context){
   
    mDefaultHandler  =Thread.getDefaultUncaughtExceptionHandler();
   
    Thread.setDefaultUncaughtExceptionHandler(this);
    }
    
    /** 
     * 当UncaughtException发生时会转入该函数来处理 
     */ 
@Override
public void uncaughtException(Thread thread, Throwable ex) {


if (!handleException(ex)&&mDefaultHandler!=null) {
// 如果用户没有处理则让系统默认的异常处理器来处理  
mDefaultHandler.uncaughtException(thread, ex);
}else {
//
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
}
}

/** 
     * 自定义错误处理,收集错误信息 
     * 发送错误报告等操作均在此完成. 
     * 开发者可以根据自己的情况来自定义异常处理逻辑 
     * @return 
     * true代表处理该异常,不再向上抛异常,
     * false代表不处理该异常(可以将该log信息存储起来)然后交给上层(这里就到了系统的异常处理)去处理,
     * 简单来说就是true不会弹出那个错误提示框,false就会弹出
     */ 
    private boolean handleException(final Throwable ex) {  
        if (ex == null) {  
            return false;  
        }  
//        final String msg = ex.getLocalizedMessage();  
        final StackTraceElement[] stack = ex.getStackTrace();
        final String message = ex.getMessage();
        //使用Toast来显示异常信息  
        new Thread() {  
            @Override 
            public void run() {  
                Looper.prepare();  
//                Toast.makeText(mContext, "程序出错啦:" + message, Toast.LENGTH_LONG).show();  
//                可以只创建一个文件,以后全部往里面append然后发送,这样就会有重复的信息,个人不推荐
                String fileName = "crash-" + System.currentTimeMillis()  + ".log";  
                File file = new File(Environment.getExternalStorageDirectory(), fileName);
                try {
                    FileOutputStream fos = new FileOutputStream(file,true);
                    fos.write(message.getBytes());
                    for (int i = 0; i < stack.length; i++) {
                        fos.write(stack[i].toString().getBytes());
                    }
                    fos.flush();
                    fos.close();
                } catch (Exception e) {
                }
                Looper.loop();  
            }  
   
        }.start();  
        return false;  
    }  
   
    // TODO 使用HTTP Post 发送错误报告到服务器  这里不再赘述
//    private void postReport(File file) {  
//      在上传的时候还可以将该app的version,该手机的机型等信息一并发送的服务器,
//      Android的兼容性众所周知,所以可能错误不是每个手机都会报错,还是有针对性的去debug比较好
//    }  


}


他的使用很简单,主要写一个全局的Application 类,直接初始化异常捕获这个类就ok,我写了个Demo测试过来,可以使用。

http://download.csdn.net/detail/u012808234/8439833

相关文章
|
缓存 监控 网络安全
因服务器时间不同步引起的异常
因服务器时间不同步引起的异常
1596 1
|
10月前
|
数据挖掘
服务器数据恢复——服务器异常断电造成raid5阵列故障的数据恢复案例
某服务器上有一组由12块硬盘组建的raid5磁盘阵列。 机房供电不稳定导致机房中该服务器非正常断电,重启服务器后管理员发现服务器无法正常使用。 意外断电可能会导致服务器上的raid模块损坏。
|
7月前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
498 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
6月前
|
域名解析 运维 监控
如何检测服务器是否被入侵?解析5大异常指标
本文系统介绍了服务器入侵的五大检测维度:硬件资源、网络流量、系统日志、文件完整性及综合防护。涵盖CPU、内存异常,可疑外联与隐蔽通信,登录行为审计,关键文件篡改识别等内容,并提供实用工具与防护建议,助力运维人员快速发现潜在威胁,提升系统安全防御能力。转载链接:https://www.ffy.com/latest-news/1916688607247077376
477 0
如何检测服务器是否被入侵?解析5大异常指标
|
弹性计算 Ubuntu 网络安全
ECS磁盘使用率异常升高,BPS,IOPS飙升
我刚开了一个2C4G的ECS,运行Ubuntu 20.04,常出现无响应、SSH断开等问题。原因是未配置swap,导致内存过高时磁盘写入频繁。解决办法在文章里。
957 72
|
9月前
|
运维 安全 算法
服务器 CPU 占用忽高忽低?排查这 6 个隐藏进程,90% 的异常都能解决
服务器运维中,CPU占用忽高忽低常由隐藏进程引发,影响服务稳定性。本文介绍六大需排查的隐藏进程:异常编译、挖矿程序、内存泄漏、网络请求异常、日志轮转问题及恶意软件。通过排查工具如top、ps、netstat等定位问题进程,并提供针对性解决方法,帮助开发者快速稳定服务器性能。
2306 0
|
9月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—服务器异常断电导致Oracle数据库报错的数据恢复案例
Oracle数据库故障: 某公司一台服务器上部署Oracle数据库。服务器意外断电导致数据库报错,报错内容为“system01.dbf需要更多的恢复来保持一致性”。该Oracle数据库没有备份,仅有一些断断续续的归档日志。 Oracle数据库恢复流程: 1、检测数据库故障情况; 2、尝试挂起并修复数据库; 3、解析数据库文件; 4、导出并验证恢复的数据库文件。
|
12月前
|
安全 Linux
阿里云linux服务器使用脚本通过安全组屏蔽异常海外访问ip
公网网站可能会遭受黑客攻击导致访问异常,使用此脚本可以屏蔽掉异常IP 恢复访问。也可自行设置定时任务定期检测屏蔽。
802 28
|
存储 安全 数据挖掘
服务器数据恢复—异常断电导致EVA存储中RAID信息丢失的数据恢复案例
意外断电导致raid硬件损坏或者riad管理信息丢失等raid模块损坏而导致数据丢失的情况非常普遍。正常情况下,磁盘阵列一旦创建完成就不会再对管理模块中的信息进行更改,但是raid管理模块中的信息属于可修改信息,一次或多次的意外断电可能会导致这部分信息被篡改或丢失。断电次数过多甚至会导致raid卡上的元器损坏。
|
Ubuntu Linux Android开发
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
本文介绍了如何在Android设备上安装Termux和AnLinux,并通过这些工具运行Ubuntu系统和桌面环境。
3956 3
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器