创建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的
异常
抛出方法,我成功地生成了所述的
,这是一个额外的好处,可以通过自定义消息优雅地终止线程。因此,这篇文章值得总结……你不会“抛出消息”,而是抛出异常。是的,我会建议使用外层处理程序来重新显示自定义异常。然而,您最初的代码在打印文本时出现异常,这表明了基本的误解。