场景:现有系统运行中会出现莫名其妙的问题,初步诊断有某些异常没有捕获,如空指针等。但是我没有办法确定是哪里抛了异常,不能调试。问题:我想在 有没有一个办法,只要系统程序中抛出了任何异常,只要没有被捕获(没有catch块处理),都把它监听到,然后记录到日志中。   简而言之,是否有办法监听到程序中的任何异常?在下先行谢过了..

解决方案 »

  1.   

    你什么样的系统?web的?还是桌面的?用了什么框架,等等,说清楚点
      

  2.   

    用spring 的aop配置可以解决你的问题,参考下边配置,monitorClass是你用于监听异常的类,类中monitorMethod方法里记录异常到你的日志。pointcut="execution(* *..service.*Service.*(..)) “ 大致意思是表示只要方法名中包含service的字符串的方法都可以监听到,具体怎么匹配,你可以自己参考下Spring aop的文档。
    下边的是参考配置
    <?xml version="1.0" encoding="UTF-8"?>   
    <beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xmlns:aop="http://www.springframework.org/schema/aop"  
        xsi:schemaLocation="   
                http://www.springframework.org/schema/beans   
                http://www.springframework.org/schema/beans/spring-beans-2.0.xsd   
                http://www.springframework.org/schema/aop   
                http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"   
        default-autowire="autodetect">   
        <aop:config>   
            <aop:aspect ref="monitorClass">   
                <aop:around pointcut="execution(* *..service.*Service.*(..))" method="monitorMethod"/>   
            </aop:aspect>   
        </aop:config>   
           
        <bean id="monitorClass" class="com.test.MonitorClass" />    
    </beans>  
      

  3.   

    记录使用Log4j吧。。空指针不用你去捕捉的。它属于RuntimeException.
      

  4.   

    系统启动的时候加入:
    System.setErr(new PrintStream(new FileOutputStream(new File("error文件"))));
    其实就算不加这个,你也能在控制台中看见error信息。
    如果你的代码中存在空代码的catch,也就是说catch异常而未处理,那就麻烦了。
      

  5.   

    http://atwo.javaeye.com/blog/183057
      

  6.   

    谢谢楼上的各位,尤其是chuan122345,你最明白我的意思。
    我不是问如何打印异常,事实上我也不可能在现有程序中到处加Try catch然后catch中打印异常。
    其实不管处于何种原因,我就是要把所有异常能收集到一起,catch住的,没有catch住的,哪怕是catch后没有任何处理的的.只要是程序中抛出的异常,我希望有个“东西”它就能感知到,然后记录下来。
      

  7.   

    可以的啊     try
        {
          //你的逻辑代码
        } 
        catch(Throwable t)
       {
         //这里处理一下,就可以捕捉所有的异常或虚拟机错误
       }
      

  8.   

    catch Throwable 试试
       我上次也是catch Exception 没有捕获任何异常,一直没有查出问题
      

  9.   

    Thread.setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 设置该线程由于未捕获到异常而突然终止时调用的处理程序。since JDK 1.5
      

  10.   

    谢谢redduke1202!
    应该就是我想要的。