自定义异常类不会捕获异常

时间:2015-09-02 20:34:25

标签: java exception exception-handling

我有一个自定义异常类,它扩展了Exception类(如下所示)。

public class SomeABCException extends Exception

但是,当我在catch区块中之前使用SomeABCException的所有位置使用此Exception时,即使它扩展Exception类本身,它也不会捕获异常。 / p>

E.g。如果父/调用方法有一个如下所示的catch块

catch (Exception e) {
    TODO something;
}

如果我有一个子方法,我正在运行一些数据库查询。

try {
    Some database queries;
} catch (SomeABCException e) {
    throw new SomeABCException (e.getMessage(),"I/O or SQL_EXCEPTION");
}

这里如果sql连接失败,catch就无法捕获异常,而是被父/调用者catch块捕获,该块使用System.Exception来捕获它。

在调试期间,它不会转到child方法的catch块中抛出。

请解释,我不明白。

5 个答案:

答案 0 :(得分:1)

我相信你在倒退。 Exception的实例只会捕获子类或其实例的异常。因此,由于ExceptionSomeABCException超类,因此SQLException不会被捕获。

答案 1 :(得分:1)

请改为尝试:

try {
    //Some database queries; -> this will throw Exception
} catch (Exception e) {
    throw new SomeABCException (e.getMessage(),"I/O or SQL_EXCEPTION");
}

当您的某些数据库查询"时,您正在捕捉SomeABCException不会抛出那种异常(可能是SQLException或类似的东西)

答案 2 :(得分:1)

这是因为您使用的方法不会抛出SomeABCException

注意所有异常扩展Exception类。

让我用一个例子来解释你:

public void mymethod() throws IOException{
   //...
}

在您的代码中,如果您尝试:

try{
    myObj.myMethod()
} catch (NumberFormatException ne){
   //... 
}

你将无法编译。在任何情况下,catch中的代码都不会调用。

答案 3 :(得分:1)

如果你的" 某些数据库查询"方法不会抛出" SomeABCException"没有办法捕获未被抛出的异常。

try {
    Some database queries;
} catch (Exception e) {
    throw new SomeABCException (e.getMessage(),"I/O or SQL_EXCEPTION");
}

"例外e"应该是一个特定的例外。 或者,如果你想让你的查询抛出异常,那么就像你一样捕获自定义异常。

try {
    Some database queries; // Make sure this method throws your custom exception
} catch (SomeABCException e) {
    //do something else with the exception.
}

答案 4 :(得分:1)

正如气垫船所提到的那样 - 它不会那样运作。检查此示例:

class ExceptionA extends Exception {}

class ExceptionB extends Exception {}

class ExceptionC extends ExceptionB {}

try {
  //some code that throws ExceptionA
} catch (Exception ex) {
   //will work
}


try {
  //some code that throws ExceptionB
} catch (ExceptionA ex) {
  //will not work
}

try {
  //some code that throws ExceptionC
} catch (ExceptionB ex) {
   //that will work
}

如此低调你只能捕获在try块或其祖先中抛出的异常。