Java - 处理方法中的多个异常

标签 java exception-handling

我正在开发一个公共(public) API 供人们在他们的应用程序中使用。我目前正在尝试找出处理异常的最佳方法。例如,以下代码片段抛出四种不同类型的异常:

Signature s = Signature.getInstance("SHA1withRSA"); //NoSuchAlgorithmException
s.initSign(keyChain.getPrivateKey());               //InvalidKeyException
s.update(plainText.getBytes("UTF-8"));              //UnsupportedEncodingException
byte[] signature = s.sign();                        //SignatureException
String signedData = base64Encoder.encode(signature);

我的问题是,我该如何以最好的方式处理这些问题?

我想到的一种方法是捕获异常并抛出自定义异常:

public void signRequest(Request request) throws APISignatureException {
    try {
        ...
        Signature s = Signature.getInstance("SHA1withRSA"); //NoSuchAlgorithmException
        s.initSign(keyChain.getPrivateKey());               //InvalidKeyException
        s.update(plainText.getBytes("UTF-8"));              //UnsupportedEncodingException
        byte[] signature = s.sign();                        //SignatureException
        String signedData = base64Encoder.encode(signature);
        ...
    }
    catch (Exception e) {
        throw new APISignatureException("Failed to create signature", e);
    }
}

这是处理开放 API 异常的好方法吗?

最佳答案

这几乎是一种合理的方式!我想说的是,如果您将 catch 替换为特定异常的列表,而不是一揽子 Exception,那么它就完全可以防御了。

不过,让所有四种类型向上传播也是很合理的。这取决于你想要什么。如果用户想立即了解失败的原因,您可以保持类型不变且未被捕获。如果你想要这个抽象层,用户只是得到一个“签名出了点问题”类型,但仍然可以深入了解细节,那么你得到的结构是理想的。

重点是您没有隐藏任何东西:原始异常仍然隐藏在新异常中,并且可供调用者使用。

关于Java - 处理方法中的多个异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26179103/

相关文章:

java - 播放所选目录中的 MP3 文件

r - 在R中检查和记录功能先决条件和后置条件的惯用方式是什么?

java - Java multi catch 中异常变量的类型是什么?

exception-handling - 如何处理@ControllerAdvice 中所有未处理的异常?

java - 从 Activity B 打开 Activity A 的特定片段

java - 在java 8中合并try catch

java - 找不到类型 : java. lang.Integer 的 validator

c# - 从流加载 XmlDocument 时缺少根元素

multithreading - C++ 0x中线程之间的异常传播

java - 从 Java 8 迁移到 Java 9