创建Java Exception子类以显示自定义消息



我有一个安全包,其中类文件共享公共Exceptions:

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显然想阻止这种情况,尽管我不明白为什么。这可以归结为希望异常的行为不像异常。你无法以任何合理的方式控制这一点。

最新更新