【问题标题】:Changing the type of Exception a method throws in Java更改方法在 Java 中引发的异常类型
【发布时间】:2011-04-13 11:58:53
【问题描述】:

我正在尝试做的事情感觉违反直觉,但 Java 总是让我感到惊讶,所以我试一试。

我在 ESAPI 库的帮助下实现了一个应用程序。这个库提供了自己的例外。除了众所周知的异常行为之外,这些异常还会执行诸如使用 log4j 自动记录日志以及向入侵检测模块提供信息等操作。

现在我想在我的应用程序的所有部分中使用这些功能。每当我的方法抛出异常时,我不会抛出正常异常,而是从新的 EnterpriseSecurityException 扩展而来的自制异常。像魅力一样工作。

但是,如果我使用一个引发正常异常的方法,我该怎么办?假设我想使用 java.io.FileInputStream 读取文件?它找不到文件并抛出 FileNotFoundException。不幸的是,FileNotFoundException 没有提供我自己的异常的功能,因为它没有扩展 EnterpriseSecurityException。

Java 中有什么技巧可以改变方法抛出的异常吗?当我写这篇文章时,这对我来说听起来很奇怪,但也许有人能想出一个解决方案。到目前为止,我唯一的想法是捕获正常异常,提取相关信息,并用它构建一个新异常。但这似乎很粗糙......

【问题讨论】:

    标签: java exception


    【解决方案1】:

    捕获异常并抛出一个从EnterpriseSecurityException 扩展的新异常,然后将旧异常传递给新异常以将它们链接在一起

    try {
        ...
    } catch (FileNotFoundException e) {
        throw new CustomEnterpriseSecurityException(e);
    }
    

    通过链接异常,您不会丢失原始异常的堆栈跟踪。

    【讨论】:

      【解决方案2】:

      你可以这样做。只需捕获原始异常并抛出您自己定义并扩展 EnterpriseSecurityException 的适当异常。确保链接异常,以免堆栈跟踪丢失。

      例如你的文件打开示例:

       try {
            //open file
          } catch (FileNotFoundException e) {
             throw new YoureCustomException("This is your message", e);
          }
      

      【讨论】:

      • 请不要丢弃堆栈跟踪数据。链接异常。
      【解决方案3】:

      也许你可以这样做:

      try{
      // file operations
      }catch(FileNotFoundException e){
       throw new MyCustomeFileNotFoundException(e);
      }
      

      为预定义的异常创建您的异常版本,当您在 catch 中获得任何预定义的异常时,抛出您定义的异常。

      【讨论】:

        【解决方案4】:

        我发现一个非常有用的技术是通过使用Exception(Throwable cause) 构造函数作为超类构造函数来链接异常。这样,您不会丢失任何堆栈跟踪,但可以在您自己的类中提供自定义处理(如果需要,可以使用 getCause() 方法查看原因)。例如:

        try{
            //do something
        }
        catch(FileNotFoundException e){
            throw new MyFileNotFoundException(e);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-01
          • 1970-01-01
          • 2018-09-13
          • 1970-01-01
          相关资源
          最近更新 更多