繁体   English   中英

更改方法抛出Java的异常类型

[英]Changing the type of Exception a method throws in Java

我想做的事情感觉反直觉,但Java一直让我感到惊讶,所以我试一试。

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

现在我想在我的应用程序的所有部分中使用这些功能。 无论何时我的方法抛出异常,我都不会抛出正常的异常,而是从新的EnterpriseSecurityException扩展的自制异常。 奇迹般有效。

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

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

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

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

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

也许你可以这样做:

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

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

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

例如,使用您的文件打开示例:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM