创建Java异常子类以显示自定义消息
我有一个安全包,其中类文件共享公共创建Java异常子类以显示自定义消息,java,exception,linked-list,try-catch,Java,Exception,Linked List,Try Catch,我有一个安全包,其中类文件共享公共异常s: catch (InvalidKeyException | NoSuchAlgorithmException e) { System.err.println("Key Exception: Invalid key is detected to sign or verify signature." + " \n"); } catch (UnrecoverableKeyE
异常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.
它产生:
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)
我的期望是:
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类永远不应该这样做
您的异常类应该如下所示:
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显然想阻止这一切,尽管我不明白为什么。这归结为希望异常的行为不像异常。您无法以任何合理的方式对此进行控制。您有一个打印消息的异常。这不是一个例外的工作
异常应该提供足够的信息来描述它报告的异常。例如,它通常会有一个消息字符串
如果某些代码捕捉到该异常,它可以(如果选择)显示消息字符串。但是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显然想阻止这一切,尽管我不明白为什么。这归结为希望异常的行为不像异常。您无法以任何合理的方式对此进行控制。不带痕迹地显示自定义消息不是一个好主意。我认为最好使用Log而不是System.err.println显示自定义消息而不显示跟踪。我认为最好使用Log而不是System.err.println遗憾的是,您误解了我的期望:一个类
捕获一系列PKI
安全异常,剖析异常
分类和消息,仅回显相应的自定义消息并隐藏所有包和类信息。遵循James Gosling的异常
抛出方法,我成功地生成了所述的类
,这是一个额外的好处,可以通过自定义消息优雅地终止线程。因此,这篇文章值得总结……你不会“抛出消息”,而是抛出异常。是的,我会建议使用外层处理程序来重新显示自定义异常。然而,您最初的代码在打印文本时出现异常,这表明了基本的误解。遗憾的是,您误解了我的期望:一个类
捕获了一系列PKI
安全异常,剖析了异常
分类和消息,仅回显相应的自定义消息并隐藏所有包和类信息。遵循James Gosling的异常
抛出方法,我成功地生成了所述的类
,这是一个额外的好处,可以通过自定义消息优雅地终止线程。因此,这篇文章值得总结……你不会“抛出消息”,而是抛出异常。是的,我会建议使用外层处理程序来重新显示自定义异常。然而,您最初的代码在打印文本时出现异常,这表明了基本的误解。