获取异常实例类名称

vic*_*ico 17 java exception

我想知道什么是异常实例情况:

try {
    // some risky actions
} catch (Exception e) {
    System.out.println("Get instance name there");
}
Run Code Online (Sandbox Code Playgroud)

怎么做到这一点?

Abh*_*ale 49

干得好:

try {
    throw new ArithmeticException();
} catch (Exception e) {
    System.out.println( e.getClass().getCanonicalName()); 
}
Run Code Online (Sandbox Code Playgroud)

输出:

java.lang.ArithmeticException 
Run Code Online (Sandbox Code Playgroud)


Adr*_*ter 9

异常的类型显示为以下输出的一部分:

e.printStackTrace();
Run Code Online (Sandbox Code Playgroud)

要以编程方式获取它,可以使用:

String exceptionClassName = e.getClass().getName();
Run Code Online (Sandbox Code Playgroud)

根据catch块中的异常子类型进行逻辑处理的形式很差。Sonar会将其标记为违反代码(鱿鱼S1193)。

相反,您应该添加多个catch块来捕获不同类型的异常:

try {
    // some risky actions
} catch (java.io.IOException e) {
    e.printStackTrace();
}
catch (java.lang.IllegalArgumentException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

从Java 7开始,您还可以执行多次捕获

} catch (java.io.IOException | java.lang.IllegalArgumentException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

多重捕获的好处在于,您可以在一个捕获块中处理多种异常类型,而不必还原到一个公共的超类(如java.lang.Exception),该类将包含许多您不想处理的异常类型。