更改Java中方法引发的异常类型

更改Java中方法引发的异常类型,java,exception,Java,Exception,我试图做的事情感觉有点违反直觉,但Java一直让我感到惊讶,所以我尝试了一下 我正在ESAPI库的帮助下实现一个应用程序。此库提供了自己的异常。除了众所周知的异常行为之外,这些异常还可以使用log4j自动记录日志,并向入侵检测模块提供信息 现在我想在我的应用程序的所有部分使用这些功能。每当我的方法抛出异常时,我不会抛出普通异常,而是抛出一个从新EnterpriseSecurityException扩展而来的自制异常。工作起来很有魅力 但是如果我使用一个抛出正常异常的方法,我能做什么呢?假设我想使

我试图做的事情感觉有点违反直觉,但Java一直让我感到惊讶,所以我尝试了一下

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

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

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


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

也许你可以这样做:

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

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

您可以这样做。只需捕获原始异常并抛出您自己定义的适当异常,它扩展了EnterpriseSecurityException。确保链接异常,以便stacktrace不会丢失

例如,打开文件示例:

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

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

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

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

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

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

请不要删除堆栈跟踪数据。将例外情况链接起来。