java中,想记录异常信息,该如何获得发生异常的类名和方法名呢?不要用log4j等。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中,想记录异常信息,该如何获得发生异常的类名和方法名呢?不要用log4j等。相关的知识,希望对你有一定的参考价值。

StackTraceElement[] st = e.getStackTrace();
string exclass=st[0].getClassName();
这样不行,得到的不是发生异常的类,而是the name of the exception.
StackTraceElement[] st = e.getStackTrace();
string exclass=st[0].getClassName().toString();
这样不行,得到的不是发生异常的类,而是the name of the exception.

我觉得你写的是对的
StackTraceElement[] st = ex.getStackTrace();
for (StackTraceElement stackTraceElement : st)
String exclass = stackTraceElement.getClassName();
String method = stackTraceElement.getMethodName();
System.out.println(exclass);
System.out.println(method);


这个就是整个异常抛出的栈结构啊追问

谢谢啊,是我想错了。获取当前类名和方法名怎么获取?

追答


exclass这个就是当前类名

method就是当前异常处的方法名

比如
public static void getA()
try
throw new Exception();
catch (Exception ex)
StackTraceElement[] st = ex.getStackTrace();
for (StackTraceElement stackTraceElement : st)
String exclass = stackTraceElement.getClassName();
String method = stackTraceElement.getMethodName();
System.out.println(new Date() + ":" + "[类:" + exclass + "]调用"
+ method + "时在第" + stackTraceElement.getLineNumber()
+ "行代码处发生异常!异常类型:" + ex.getClass().getName());




调用后打印结果就是
Thu Sep 27 14:59:41 CST 2012:[类:AAA]调用getA时在第6行代码处发生异常!异常类型:java.lang.Exception
Thu Sep 27 14:59:41 CST 2012:[类:sss]调用main时在第4行代码处发生异常!异常类型:java.lang.Exception

追问

我写的运行出来不是这个结果啊。是不是跟我抛出的异常类型有关,我抛出的是SQLException,最后得到是类名和方法名都是sql上层的类和方法。

追答

应该不是 这个是个栈结构 你去取st[0]应该是最上层的位置吧,你需要取的是st[st.length-1]

参考技术A 楼主你问的这个问题很有水平啊 你要获得方法名和类名 建议你Debug跟踪一下 或者1楼写的那样看看什么异常 查查api 参考技术B 使用的st应该转换成String追问

谢谢,刚才我随便写的,没注意。但我要问的不是这个问题。

追答

try
//代码块
catch (Exception e)
System.out.println(e.getMessage());
这样就可以了

参考技术C try
//代码块

catch (Exception e)
System.out.println(e.getMessage());
//这样就可以捕获你的错误追问

是我没说明白么?我想获得发生异常的类名,方法名,并把他们单独存放在相应的变量里。

Java学习记录7 异常

1. 异常机制

  1. 异常(Exception):意思是例外。软件程序在运行过程中遇到的例外。

  2. 格式:try{}catch(Exception e){e.printStackTrace();}

  3. Java是采用面向对象的方式来处理异常的。处理过程:

    1. 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE。

    2. 捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常。JRE在方法的调用栈中查找,从生成异常的方法来开始追溯,直到找到相应的异常处理代码为止。

  4. 异常的分类:

    1. 所有异常的根类:Throwable。

    2. Error:自己处理不了的问题,需要重启虚拟机。

    3. Exception:程序本省能够处理的异常。是所有异常类的父类,其子类对应了各种各样可能出现的异常事件。

      1. Checked Exception已检查异常:编译器需要处理。编译时通不过。方法1:try catch,方法2:throws抛出

        try{
           语句1;
           语句2:
        }catch(Exception1 e){
           
        }catch(Exception2 e/*异常类型*/){
           
        }finally{
           //是否遇到异常,这里都会最后执行。
        }
        如果语句1有异常,语句2就不执行了,直接执行相应的异常处理语句,最后执行finally。
           
        //方法1:捕获异常try catch    
        FileReader reader = null;
        try {

        reader = new FileReader("d:/bb.txt");
        char c1 = (char) reader.read();//读文件的一个字符
        System.out.println(c1);
        } catch (FileNotFoundException e) {//子类异常在父类前面

        e.printStackTrace();//打印异常信息
        } catch(IOException e){
        e.printStackTrace();
        }finally{
        try {
        if(reader != null)
        {
        reader.close();
        }
        } catch (IOException e) {
        ?
        e.printStackTrace();
        }
        }
        方法2:声明异常throws抛出,谁调用谁处理
           
         public static void main(String[] args) throws IOException /*抛給了JRE*/{
        readMyFile();
        }
        ?
        public static void readMyFile() throws IOException {
        FileReader reader = null;
        reader = new FileReader("d:/bb.txt");
        char c1 = (char) reader.read();// 读文件的一个字符
        System.out.println(c1);
        ?
        if (reader != null) {
        reader.close();
        }
        }  

         

      2. Runtime Exception(Unchecked Exception)运行时异常:编译器不需要处理。逻辑判断处理来避免这些异常。

                int a = 0;
        int b = 1;
        if(a != 0)
        {
        System.out.println(b/a);
        }
        //java.lang.NullPointerException 空指针异常
        String str = null;
        if(str != null)
        {
        System.out.println(str.length());
        }

         

    4. 手动抛出异常

      1. 自定义异常:如果继承Exception类,则为受检查异常,必须对其进行处理。如果不想处理,可以让自定义异常类继承运行时异常RuntimeException类。

      2. alt+shift+s:弹出Source下拉框

        public static void main(String[] args) {
    Person p = new Person();
    p.setAge(-10);
    }
    ?
    class Person{
    private int age;
    ?
    public int getAge() {
    return age;
    }
    ?
    public void setAge(int age) {
    if(age < 0){
    try {
    throw new IllegaAgelException("年龄不能为负数");
    } catch (IllegaAgelException e) {

    e.printStackTrace();
    }
    }
    this.age = age;
    }


    }
    class IllegaAgelException extends Exception{
    public IllegaAgelException(){

    }
    public IllegaAgelException(String msg){
    super(msg);

    }
    }

     

以上是关于java中,想记录异常信息,该如何获得发生异常的类名和方法名呢?不要用log4j等。的主要内容,如果未能解决你的问题,请参考以下文章

Java学习记录7 异常

Java学习记录7 异常

如果发生异常,如何禁用记录 Kafka 批处理中的所有消息?

Java异常类及处理

如何避免记录来自 Java 异常的敏感信息?

java异常拾遗