我有一个安全包,其中类文件共享公共Exception
s:
catch (InvalidKeyException | NoSuchAlgorithmException e) {
System.err.println("Key Exception: Invalid key is detected to sign or verify signature." + " n");
} catch (UnrecoverableKeyException e) {
System.err.println("Key Exception: Faulty key can not be used to sign signature." + " n");
} catch (KeyStoreException e) {
System.err.println("KeyStore Exception: key Store may be faulty." + " n");
……………
我尝试使用DSCoreException
,它可以根据对象的getLocalizedMessage()
结果(不包括异常类名(返回自定义描述性消息。实现的要点是:
catch (Exception e) {
throw new DSCoreException(e);
}
…………………..
class DSCoreException extends Exception {
DSCoreException(Exception s) {
super(s.getLocalizedMessage());
if (super.getLocalizedMessage().contains("Signature not available")) {
System.err.println("Key Exception: Invalid key algorithm is used to sign signature." + " n");
}
}
它产生:
Key Exception: Invalid key algorithm is used to sign signature.
Exception in thread "main" com.fc.security.DSCoreException: SHA512withDSA Signature not available
at com.fc.security.TestException.main(TestException.java:91)
我的期望是:
Key Exception: Invalid key algorithm is used to sign signature.
如何仅显示我的自定义消息?(if
之后将有else-if
(
您有一个打印消息的异常。这不是一个例外的工作。
异常应该提供足够的信息来描述它所报告的异常。例如,它通常会有一个消息字符串。
如果某些代码捕捉到该异常,它可以(如果它选择的话(显示消息字符串。但是Exception类永远不应该。
您的异常类应该看起来像:
class DSCoreException extends Exception {
DSCoreException(String msg) {
super(msg);
}
... more needed here ...
}
然后,也许您有一个异常处理程序来用您自己的异常替换特定的异常。
try {
do_something_here();
}
catch (Exception ex) { // NOTE really ought to be a narrower class
if (ex.getLocalizedMessage().contains("Signature not available"))
ex = new DSCoreException("Key Exception: Invalid key algorithm is used to sign signature.");
throw ex;
}
您可以捕获异常,检查它以查看它是什么,并在重新抛出它之前选择用更好的异常替换它
根据您的整体需求,略有不同:
try {
do_something_here();
}
catch (Exception ex) { // NOTE really ought to be a narrower class
String msg = ex.getLocalizedMessage();
if (msg.contains("Signature not available"))
msg = "Key Exception: Invalid key algorithm is used to sign signature.";
throw new DSCoreException(msg);
}
该消息总是抛出DSCoreException,但可能会替换消息。这会将所有异常转换为"your"类,这可能对调用代码的人有好处。
这里的基本教训是,异常是一个控制流设备,而不仅仅是打印错误的东西。即使在您打算显示消息的简单情况下,异常也是将错误条件信息获取到将要显示消息的代码的一种方式;异常本身不应该进行显示。
在一条现已删除的评论中提出的反对意见是,异常的捕获器可以获得堆栈跟踪,从而揭示包名称等信息。OP显然想阻止这种情况,尽管我不明白为什么。这可以归结为希望异常的行为不像异常。你无法以任何合理的方式控制这一点。