代码之家  ›  专栏  ›  技术社区  ›  ssahmed555

Java:捕获其超类型在throws列表中的异常

  •  2
  • ssahmed555  · 技术社区  · 15 年前

    我偶尔会用以下方式编写Java代码:

    public static TrustManager[] getTrustManagers(TruststoreParams tsParams)
    throws IOException, GeneralSecurityException {
        TrustManagerFactory tmf = null;
        FileInputStream fis = null;
        try {
            ...
            return tmf.getTrustManagers();
        }
        catch (NoSuchAlgorithmException nsae) {
            throw new RuntimeException(nsae);
        }
        finally {
            ...
        }
    

    NoSuchAlgorithmException 与其他安全相关的异常有点不同。我想知道,如果有什么根本上错误的异常处理方法,上面我有 GeneralSecurityException 在throws列表中有一个super类型,但我专门捕获和处理它的一个子类型,并将其包装为一个 RuntimeException

    如果与我在上面设置的方法不同,您将如何重写上面的方法框架?为什么?

    3 回复  |  直到 15 年前
        1
  •  4
  •   Justin K    15 年前

    在我看来这很合理。通过抛出RuntimeException,您实际上是将该情况视为致命错误,如果应用程序要求您使用特定的算法,这是有意义的。

        2
  •  2
  •   Rodney Gitzel    15 年前

    捕捉比抛出的异常更具体的异常是有意义的,因为如果您有特定的响应,那么响应特定的案例总是很好的。不过,在这种情况下,为什么要用 RuntimeException GeneralSecurityException ,也就是说,太糟糕了,你想绕开打电话的人通常的处理方式吗?一个不同的 一般安全例外

    NoSuchUser ). "“系统”或基础设施问题 从某种程度上说,因为打电话的人真的什么都做不了,只能在电话里说出来。

    对你来说,打电话的人能帮你做些什么吗 IOException 或者 一般安全例外

        3
  •  0
  •   Peter Tillemans    15 年前

    NoSuchAlgorithmException 那么它应该在没有进一步援助的情况下处理它。

    我会做一些像

     try {
         ...
         trustManager.getTrustmanagers(...);
    
     } catch (GeneralSecurityException e) {
         if (e instanceof NoSuchAlgorithmException) {
            // do something special 
         } else {
            // do regular error handling
         }
     }
    

    在这种情况下,不需要创建多余的结构来触发远距离的动作,当我绊倒它们时,我发现这些动作总是令人困惑。

    我必须承认,我更喜欢RuntimeExceptions而不是checked Exceptions,但在本例中不是这样,因为它只是在特殊情况之上添加了特殊情况。

    推荐文章