我有一个自定义异常类,它扩展了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块中抛出。
请解释,我不明白。
答案 0 :(得分:1)
我相信你在倒退。 Exception
的实例只会捕获子类或其实例的异常。因此,由于Exception
是SomeABCException
的超类,因此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块或其祖先中抛出的异常。