[编码模式]记录异常

背景

当异常不在调试的机器上发生的时候,我们可能需要记录异常并且发送给远端服务器。

场景

创建一个移动应用,当用户的某些操作,或者是特定手机上运行出现异常的时候,我们可能需要将异常发送给开发者。

实例

Reporter.java

public interface Reporter {
    public void report(Throwable t);
}

ExceptionReporter.java

public class ExceptionReporter {
    public static final Reporter PrintException = new Reporter() {
        @Override
        public void report(Throwable t) {
            System.out.println(t.toString());
        }
    };

    private static Reporter defalutReporter = PrintException;

    public static Reporter getPrintException(){
        return PrintException;
    }

    public static Reporter getExceptionReporter(){
        return defalutReporter;
    }

    public static Reporter setExceptionReporter(Reporter reporter){
        defalutReporter = reporter;
        return defalutReporter;
    }
}

EmailExceptionReporter.java

public class EmailExceptionReporter implements Reporter {
    @Override
    public void report(Throwable t) {
        sendMessage(t.toString());
    }

    private void sendMessage(String message){
        // Send email
    }
}

Test.java

public class Test {
    public static void main(String args[]){
        try{
            int a[] = {0, 0};
            System.out.print(a[2]);
        }catch (Exception e){
            ExceptionReporter.getPrintException().report(e);
        }

        try{
            String b = null;
            b.toCharArray();
        }catch (Exception e){
            ExceptionReporter.setExceptionReporter(new EmailExceptionReporter()).report(e);
        }
    }
}
时间: 2024-11-13 09:49:26

[编码模式]记录异常的相关文章

Atitit mysql 存储过程捕获所有异常,以及日志记录异常信息

1.1. 异常的处理模式exit  continue undo模式 1 1.2. 捕获所有异常使用        DECLARE continue HANDLER FOR   sqlexception 1 1.3. 捕获特定异常使用HANDLER FOR  errorcode 2 1.4. 记录异常到日志表,获取异常代码和异常信息 2 1.5. 抛出自定义异常 3 2. 程序语言中捕获sql自定义抛出的异常 3 2.1. 代码 3 3. 集合的循环loop while repeat模式 4 3.

记录异常日志的7条规则

最近一直在帮忙调试一些让人头大的bug问题,这才意识到如何记录异常日志对于简化调试的重要性,我总结了几点记录异常日志的最佳实践发表在此. 1.记录技术性异常而不是用户异常 用户异常(如:“登录用户名已经存在”)除了显示给用户,要么什么都别管,要么根本就不是异常(“用户尚未认证”).技术性异常(如:“文件存储不够,没法订阅此产品”)才是你需要调试而为此做出反应的,如果你记录所有事情很有可能因日志实体太长而不能真正有意义的反映到你所记录异常日志中.你应该查明日志文件中的每个异常找到其原因(“是bug

一个低级错误引发Netty编码解码中文异常

前言 最近在调研Netty的使用,在编写编码解码模块的时候遇到了一个中文字符串编码和解码异常的情况,后来发现是笔者犯了个低级错误.这里做一个小小的回顾. 错误重现 在设计Netty的自定义协议的时候,发现了字符串类型的属性,一旦出现中文就会出现解码异常的现象,这个异常并不一定出现了Exception,而是出现了解码之后字符截断出现了人类不可读的字符.编码和解码器的实现如下: // 实体 @Data public class ChineseMessage implements Serializab

java发送邮件监控并记录异常

根据项目管理的内容,我们一般在立项之前,需要对项目可行性进行分析.论证.评估,最终需要出具<项目可行性分析报告>,论证项目在技术.经济.运行环境以及其他项目相关方面的可行性.效益.必要性.理论很好,避免项目失败.因为作可行性分析只占项目投资的0.5%~1%,如果能在前期就能把问题论证好了,当然是功德无量的一件事情.但是在实践中,项目可行性却无法起到相应的作用.在项目中,人是最大的主观因素,人也是最大的决定因素.所以也要从人讲起:客户:客户是投资人,是项目发起人.客户虽然不知道项目如何实现,实现

Atitit dsl实现(1)------异常的库模式实现 &#160;异常的ast结构

Atitit dsl实现(1)------异常的库模式实现  异常的ast结构 1.1. Keyword 1 1.2. 异常的ast模型 1 1.3. Astview的jar org.eclipse.jdt.core_3.10.0.v20140902-0626.jar 1 1.4. Astviewd look 1 1.5. 异常的ast模式 2 1.6. import org.eclipse.jdt.core.dom.TryStatement; 2 1.7. import org.eclipse

Log4Net在MVC下的配置以及运用线程队列记录异常信息

Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题.日志的作用:将运行过程的步骤.成功失败记录下来,将关键性的数据记录下来分析系统问题所在.Log4J.对于网站来讲,不能把异常信息显示给用户,异常信息只能记录到日志,出了问题把日志文件发给开发人员,就能知道问题所在. 配置Log4Net环境 (1)新建一个WebApplication (2)添加对log4net.dl

关于C# 在TXT写入数据使用UTF-8 bom编码模式

C#中通过 1 StreamWriter sw = new StreamWriter(path, true); 2 sw.WriteLine(Content); 这样的代码写入TXT中的数据默认的编码是GB2312格式,那么如何才能使用utf-8的编码格式写入TXT呢? 代码如下: 1 UTF8Encoding utf8 = new UTF8Encoding(false); 2 StreamWriter sw = new StreamWriter(path, true, utf8); 这样确实使

嵌入式中 ARM的几种工作模式 以及异常模式的优先级

一.Arm工作模式: Arm微处理器支持7种工作模式,分别为: 1. 用户模式(Usr)            用于正常执行程序 2. 快速中断模式(FIQ)    用于高速数据传输 3. 外部中断模式(IRQ)   用于通常的中断处理 4. 管理模式(SVC)          操作系统使用的保护模式(高权限),复位和软件中断进入 5. 数据访问终止模式(abt)   当数据或指令预取终止时进入该模式,可用于虚拟内存及存储保护 6. 系统模式(sys)            运行均有特权的操作

编写高质量代码改善C#程序的157个建议——建议70:避免在调用栈较低的位置记录异常

建议70:避免在调用栈较低的位置记录异常 并不是所有的异常都要被记录到日志,一类情况是异常发生的场景需要被记录,还有一类就是未被捕获的异常.未被捕获的异常通常被视为一个Bug,所以,对于它的记录,应该被视为系统的一个重要组成部分. 最适合记录异常和报告的是应用程序的最上层,这通常是UI层.假设存在这样一个应用程序,它的BLL层可能被一个WinForm窗体调用,也可能被一个控制台应用程序调用,那么要在BLL模块向管理员报告异常的时候,你可能会不知道该使用MessageBox方法还是使用Consol