`
zhanhao
  • 浏览: 286759 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android异常处理发送消息给服务器

阅读更多

 

转自:http://www.cnblogs.com/stay/archive/2011/07/21/2113167.html

程序员最头疼的事情就是bug和debug。这次debug长达20天,搞的我心力交瘁。累,因为Android兼容性,不同手机会有不同的bug出来,而且很难复现,所以就上网找了下类似保存错误log到文件再上传到服务器,现把源码也共享出来。上传至服务器的代码我没加。相信大家都有现成的代码了。

先讲下原理,跟JavaEE的自定义异常捕获一样,将错误一直向上抛,然后在最上层统一处理。这里就可以获得Exception Message,进行保存操作

异常捕获类如下:

/**
 * @author Stay
 *      在Application中统一捕获异常,保存到文件中下次再打开时上传
 */
public class CrashHandler implements UncaughtExceptionHandler {  
    /** 是否开启日志输出,在Debug状态下开启, 
     * 在Release状态下关闭以提示程序性能 
     * */  
    public static final boolean DEBUG = true;  
    /** 系统默认的UncaughtException处理类 */  
    private Thread.UncaughtExceptionHandler mDefaultHandler;  
    /** CrashHandler实例 */  
    private static CrashHandler INSTANCE;  
    /** 程序的Context对象 */  
//    private Context mContext;  
    /** 保证只有一个CrashHandler实例 */  
    private CrashHandler() {}  
    /** 获取CrashHandler实例 ,单例模式*/  
    public static CrashHandler getInstance() {  
        if (INSTANCE == null) {  
            INSTANCE = new CrashHandler();  
        }  
        return INSTANCE;  
    }  
    
    /** 
     * 初始化,注册Context对象, 
     * 获取系统默认的UncaughtException处理器, 
     * 设置该CrashHandler为程序的默认处理器 
     *  
     * @param ctx 
     */  
    public void init(Context ctx) {  
//        mContext = ctx;  
        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 //如果自己处理了异常,则不会弹出错误对话框,则需要手动退出app
            try {  
                Thread.sleep(3000);  
            } catch (InterruptedException e) {  
            }  
            android.os.Process.killProcess(android.os.Process.myPid());  
            System.exit(10);  
        }  
    }  
    
    /** 
     * 自定义错误处理,收集错误信息 
     * 发送错误报告等操作均在此完成. 
     * 开发者可以根据自己的情况来自定义异常处理逻辑 
     * @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 onCreate时就注册ExceptionHandler,此后只要程序在抛异常后就能捕获到。

public class App extends Application{
        @Override  
        public void onCreate() {  
            super.onCreate();  
            CrashHandler crashHandler = CrashHandler.getInstance();  
            //注册crashHandler  
            crashHandler.init(getApplicationContext());  
        }  
}
public class LogActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        try {//制造bug
            File file = new File(Environment.getExternalStorageState() ,"crash.bin");
            FileInputStream fis = new FileInputStream(file);
            byte[] buffer = new byte[1024];
            fis.read(buffer);
        } catch (Exception e) {
            //这里不能再向上抛异常,如果想要将log信息保存起来,则抛出runtime异常,
//          让自定义的handler来捕获,统一将文件保存起来上传
            throw new RuntimeException(e);
        }
    }
}

注意,如果catch后不throw就默认是自己处理了,ExceptionHandler不会捕获异常了。

再分享一个Log的封装类,只要在这里设置DEBUG的值就能让控制台是否打印出log

public class DebugUtil {
    public static final String TAG = "ICON";
    public static final boolean DEBUG = true;
      
    public static void toast(Context context,String content){
        Toast.makeText(context, content, Toast.LENGTH_SHORT).show();
    }
      
    public static void debug(String tag,String msg){
        if (DEBUG) {
            Log.d(tag, msg);
        }
    }
      
    public static void debug(String msg){
        if (DEBUG) {
            Log.d(TAG, msg);
        }
    }
      
    public static void error(String tag,String error){
        Log.e(tag, error);
    }
      
    public static void error(String error){
        Log.e(TAG, error);
    }
}
分享到:
评论

相关推荐

    Android-Android异常捕获以及上传到服务器

    总之,Android应用的异常处理不仅涉及本地捕获和处理,还包括将异常信息上报到服务器,以供开发者进行远程分析和修复。通过自定义UncaughtExceptionHandler并配合网络请求库,可以实现这一目标。请确保在实际应用中...

    android工程全局异常处理-将未处理异常日志保存在文件中,可后续开发提交至服务器

    在Android应用开发中,异常处理是一项至关重要的任务,它能够确保程序在遇到错误时不会突然崩溃,而是能够优雅地处理并记录错误信息。本篇主要介绍如何实现一个全局的异常处理机制,以便将未处理的异常日志保存到...

    android 异常处理机制

    以下将详细介绍Android异常处理机制及其优化策略。 首先,Android系统在遇到未被捕获的异常时,会触发系统默认的错误报告,弹出“应用无响应”(ANR)对话框,这不仅对用户不友好,也无助于开发者定位问题。为了...

    Android 捕获全局异常处理

    总结,Android全局异常处理是一个多步骤的过程,包括创建监听器、捕获异常、展示反馈、记录日志、发送邮件以及上传服务器。这些步骤可以帮助开发者快速定位和修复问题,提高应用的稳定性和用户体验。在实际项目中,...

    android_异常处理_对异常进行全局捕捉

    在这个方法中,可以定义当主线程(main)发生异常时的处理逻辑,例如,显示一个Toast消息给用户,提示发生了异常,并且等待几秒后杀死进程退出应用。如果是其他子线程发生异常,则可以定义其他的处理逻辑,比如启动一...

    android开发,异常处理,捕获异常上传到bugly,捕获异常库module

    3. 异常上报:封装Bugly的API,将异常信息发送到Bugly服务器。 4. 错误界面:在捕获到严重异常时,显示一个友好的错误界面,告知用户应用遇到了问题并提供反馈选项。 5. 模块化设计:使异常处理功能可以轻松地接入到...

    Android 全局异常处理

    一、Android异常处理基础 在Android中,异常主要分为两种类型:未捕获异常(Uncaught Exception)和已捕获异常。未捕获异常通常会导致应用程序崩溃,而已捕获异常则可以通过try-catch语句块进行处理。为了确保应用...

    CrashHandler android异常处理

    1. **Android异常处理基础** Android系统默认提供了异常处理机制,但通常只提供简单的堆栈跟踪信息,并不足以进行深入的问题排查。为了提供更全面的错误报告和更好的用户体验,开发者需要自定义异常处理器。 2. **...

    Android 应用异常信息捕捉,邮件发送给开发者

    在这个场景中,"Android应用异常信息捕捉,邮件发送给开发者"是一个实用的解决方案,它利用了`UncaughtExceptionHandler`来实现。 `UncaughtExceptionHandler`是Android系统提供的一个接口,用于处理未被捕获的异常...

    reactnative异常处理库

    部分库还支持将这些信息发送到远程服务器,便于后期分析和调试。 4. **自定义错误处理逻辑**: 除了默认的错误处理,开发者还可以根据需要添加自己的错误处理逻辑,例如显示友好的错误提示给用户,或者在后台进行...

    android 异常捕捉和日志文件保存

    一、Android异常处理 1. **异常分类**:在Android中,异常主要分为两种类型——Checked Exception(已检查异常)和Unchecked Exception(未检查异常)。已检查异常在编译时必须被捕获或声明,如IOException;未检查...

    Android异常捕获(发邮件+写文件)

    总结来说,Android异常捕获是提升应用稳定性和用户体验的关键步骤。通过自定义`UncaughtExceptionHandler`,我们可以收集并记录异常信息,甚至在发生异常时主动向开发者报告,以便及时修复问题。在实际开发中,还应...

    android发送文字信息至服务器端

    9. **响应反馈**:服务器处理完请求后,通常会返回一个状态码和可能的响应数据。Android客户端需要解析这个响应,根据状态码判断操作是否成功,并可能更新UI展示结果。 以上就是"android发送文字信息至服务器端"这...

    Android程序崩溃异常处理之自动发送邮件

    在Android开发中,程序崩溃异常处理是至关重要的,它直接影响到用户体验和产品质量。当应用程序遇到无法处理的错误时,系统会记录一个崩溃日志,这些日志包含了异常发生时的详细信息,对于开发者来说,是定位和修复...

    Android crash异常信息保存到SD卡中并上传到服务器

    总结来说,通过自定义Crash Handler,我们可以有效地收集和处理Android应用的异常信息,将其保存到SD卡,然后上传到服务器,从而提高故障排查的效率,提升应用的稳定性。同时,也要注意处理过程中的数据安全和隐私...

    android-crash, [DEPRECATED] android程序崩溃异常处理框架.zip

    在Android开发中,崩溃异常处理框架是至关重要的,它能够帮助开发者及时捕获并记录应用程序运行时出现的错误,从而提高应用的稳定性和用户体验。"android-crash"框架,尽管已被废弃,但仍然能为我们提供一些关于如何...

    Android全局异常捕获

    因此,实现Android全局异常捕获是一个必要的技术手段,它可以帮助开发者捕获并处理运行时出现的任何异常,避免程序无故终止,并提供调试信息。 全局异常捕获的基本思路是在应用程序的主进程中创建一个顶级的异常...

    android 异常崩溃demo

    一、Android异常处理基础 在Android系统中,异常分为检查异常(Checked Exception)和运行时异常(Runtime Exception)。检查异常是可以在编译时期就能发现的,如IOException,需要显式捕获或声明抛出。运行时异常...

    android studio连接云服务器mysql实现登录注册

    在Android客户端和服务器端都需要进行异常处理,捕获可能出现的网络、解析、数据库等错误,提供友好的用户反馈。 9. **测试与优化**: 对登录注册功能进行单元测试和集成测试,确保功能正常。优化网络请求,减少...

    android访问tomcat服务器

    在Android开发中,有时我们需要与后端服务器进行交互,实现数据的发送和接收。本案例主要探讨了如何使用Android客户端访问Tomcat服务器,实现用户注册、登录功能,并将MySQL数据库中的数据通过ListView组件展示。...

Global site tag (gtag.js) - Google Analytics