【问题标题】:Custom exception class does not catch exceptions自定义异常类不捕获异常
【发布时间】:2015-09-02 20:34:24
【问题描述】:

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

public class SomeABCException extends Exception

但是,当我在之前在 catch 块中使用 Exception 的所有地方使用此 SomeABCException 时,即使它扩展了 Exception 类本身,它也不会捕获异常。

例如如果父/调用方方法具有如下的 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 捕获它。

在调试期间,它不会在子方法的 catch 块中进行 throw。

请解释一下,我不明白。

【问题讨论】:

  • 请去掉上面代码帖子中放错位置的***,因为它们非常分散注意力。另请注意,如果代码块没有抛出您的异常,那么您的异常将不会被捕获。
  • 其实如果 SomeABCException 是扩展 Exception 类,如果有 com.microsoft.sqlserver.jdbc.SQLServerException,那么应该被 SomeABCException catch 块捕获吧?
  • 这是非常非常错误的。恐怕您误解了异常的工作原理。请阅读下面的许多答案,并查看有关异常的教程,因为我感觉几分钟后会亮起灯来,您会看到假设的错误。运气。
  • 非常正确,现在明白了...感谢您的帮助。 :)

标签: java exception exception-handling


【解决方案1】:

试试这个:

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

当你的“一些数据库查询”没有抛出那种异常(可能是一些 SQLException 或类似的东西)时,你正在捕捉 SomeABCException

【讨论】:

    【解决方案2】:

    这是因为您使用的方法没有抛出 SomeABCException

    注意所有异常都扩展了Exception 类。

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

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

    如果您尝试这样做,请在您的代码中:

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

    您将无法编译。无论如何,catch 中的代码永远不会调用。

    【讨论】:

      【解决方案3】:

      如果您的“一些数据库查询”方法没有引发“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】:

        正如气垫船提到的那样——它不是那样工作的。检查这个例子:

        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 块或其祖先中抛出的异常。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-05-24
            • 2021-11-14
            • 1970-01-01
            • 1970-01-01
            • 2010-10-08
            • 2023-03-21
            • 2018-05-30
            相关资源
            最近更新 更多