【问题标题】:Catch with multiple exceptions not catching exceptions in obfuscated build捕获多个异常而不捕获混淆构建中的异常
【发布时间】:2017-11-14 08:16:47
【问题描述】:

我使用了带有多个异常的 catch 块,在未混淆的构建中运行良好,但在混淆构建中没有捕获异常。

我正在使用 proguard-maven-plugin

try {
  ...
} catch (ServletException | IOException e){
  ...
}

我需要为此添加任何 proguard 规则吗?

因为它工作正常当我将代码编写为

try {
  ...
} catch (ServletException e) {
  ...
} catch (IOException e) {
  ...
}

【问题讨论】:

  • Proguard 不应该对此产生影响。也许它是由一些无关的东西引起的。您确定您要比较的两个版本仅在使用和未使用 proguard 方面有所不同吗?另外,如果你有两个用于单个异常类型的 catch 块,这有什么区别吗?
  • 是的,两个版本比较只是在 proguard 上有所不同。当我为单个异常编写两个 catch 块时,它工作正常。
  • 你试过添加 -keepattributes 例外吗?文档说“指定方法可能抛出的异常。编译器可以使用此信息来强制捕获它们。”
  • 是的,我添加了 -keepattributes 例外
  • 显然是open bug on Proguard。您可能需要添加对该错误的评论,以便向团队提供您的反馈。

标签: java try-catch proguard obfuscation


【解决方案1】:

Proguard 可能存在错误。 https://sourceforge.net/p/proguard/bugs/607/ 不幸的是,没有提供解决方案。 我建议在可能的情况下避免多次捕获,直到它没有被修复。

【讨论】:

  • 我使用了上述缺陷 607 中报告的相同代码库,并且可以报告从 Proguard Gradle 插件 'net.sf.proguard:proguard-gradle:6.0.1' 开始,该缺陷仍然存在。遗憾的是,使用 Proguard,我们必须避免 Java 7 和 8 的 multi-catch (E | E) 特性。使用“-dontpreverify”可以抑制问题,但这会导致我们进一步产生下游影响。
【解决方案2】:

当有机会引发没有任何关系(父子)的异常时,可以使用多捕获异常,例如IOExceptionArithmeticExceptionNullPointerException。但是你不能使用 multi catch 块,除了 IOExceptionFileNotFoundException 之类的异常,因为 IOExceptionFileNotFoundException 的父级。

java7 中给出了 Multi catch 块只是为了方便程序员。不影响执行时间。

【讨论】:

  • 请再次阅读有关 proguard 和混淆的问题
猜你喜欢
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 2014-11-24
  • 2022-12-02
相关资源
最近更新 更多