我正在开发一个公共(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/