From bf642ff9db3f35d490cc1a5f7b413d01dc1a417b Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 13 Jan 2017 15:30:09 -0500 Subject: [PATCH] Continue failure analysis when an analyzer throws an exception Previously, if a failure analyzer threw an exception from its analyze method, failure analysis would stop. This commit updates FailureAnalyzers to catch and log any Throwable thrown by an analyzer and continue to the next available analyzer. Closes gh-7956 --- .../boot/diagnostics/FailureAnalyzers.java | 11 +++++++--- .../diagnostics/FailureAnalyzersTests.java | 22 ++++++++++++++++--- ...en.factories => broken-analysis.factories} | 2 +- .../broken-initialization.factories | 4 ++++ 4 files changed, 32 insertions(+), 7 deletions(-) rename spring-boot/src/test/resources/failure-analyzers-tests/{broken.factories => broken-analysis.factories} (89%) create mode 100644 spring-boot/src/test/resources/failure-analyzers-tests/broken-initialization.factories diff --git a/spring-boot/src/main/java/org/springframework/boot/diagnostics/FailureAnalyzers.java b/spring-boot/src/main/java/org/springframework/boot/diagnostics/FailureAnalyzers.java index 96a90447f9e..e5a5da3acb0 100644 --- a/spring-boot/src/main/java/org/springframework/boot/diagnostics/FailureAnalyzers.java +++ b/spring-boot/src/main/java/org/springframework/boot/diagnostics/FailureAnalyzers.java @@ -115,9 +115,14 @@ public final class FailureAnalyzers { private FailureAnalysis analyze(Throwable failure, List analyzers) { for (FailureAnalyzer analyzer : analyzers) { - FailureAnalysis analysis = analyzer.analyze(failure); - if (analysis != null) { - return analysis; + try { + FailureAnalysis analysis = analyzer.analyze(failure); + if (analysis != null) { + return analysis; + } + } + catch (Throwable ex) { + log.debug("FailureAnalyzer " + analyzer + " failed", ex); } } return null; diff --git a/spring-boot/src/test/java/org/springframework/boot/diagnostics/FailureAnalyzersTests.java b/spring-boot/src/test/java/org/springframework/boot/diagnostics/FailureAnalyzersTests.java index 83aa28cf80f..2b1c6fdcb4c 100644 --- a/spring-boot/src/test/java/org/springframework/boot/diagnostics/FailureAnalyzersTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/diagnostics/FailureAnalyzersTests.java @@ -62,9 +62,16 @@ public class FailureAnalyzersTests { } @Test - public void brokenAnalyzerDoesNotPreventOtherAnalyzersFromBeingCalled() { + public void analyzerThatFailsDuringInitializationDoesNotPreventOtherAnalyzersFromBeingCalled() { RuntimeException failure = new RuntimeException(); - analyzeAndReport("broken.factories", failure); + analyzeAndReport("broken-initialization.factories", failure); + verify(failureAnalyzer, times(1)).analyze(failure); + } + + @Test + public void analyzerThatFailsDuringAnalysisDoesNotPreventOtherAnalyzersFromBeingCalled() { + RuntimeException failure = new RuntimeException(); + analyzeAndReport("broken-analysis.factories", failure); verify(failureAnalyzer, times(1)).analyze(failure); } @@ -83,7 +90,7 @@ public class FailureAnalyzersTests { } - static class BrokenFailureAnalyzer implements FailureAnalyzer { + static class BrokenInitializationFailureAnalyzer implements FailureAnalyzer { static { Object foo = null; @@ -97,6 +104,15 @@ public class FailureAnalyzersTests { } + static class BrokenAnalysisFailureAnalyzer implements FailureAnalyzer { + + @Override + public FailureAnalysis analyze(Throwable failure) { + throw new NoClassDefFoundError(); + } + + } + interface BeanFactoryAwareFailureAnalyzer extends BeanFactoryAware, FailureAnalyzer { } diff --git a/spring-boot/src/test/resources/failure-analyzers-tests/broken.factories b/spring-boot/src/test/resources/failure-analyzers-tests/broken-analysis.factories similarity index 89% rename from spring-boot/src/test/resources/failure-analyzers-tests/broken.factories rename to spring-boot/src/test/resources/failure-analyzers-tests/broken-analysis.factories index 8f9e5e4d91b..b1dce498466 100644 --- a/spring-boot/src/test/resources/failure-analyzers-tests/broken.factories +++ b/spring-boot/src/test/resources/failure-analyzers-tests/broken-analysis.factories @@ -1,4 +1,4 @@ # Failure Analyzers org.springframework.boot.diagnostics.FailureAnalyzer=\ -org.springframework.boot.diagnostics.FailureAnalyzersTests$BrokenFailureAnalyzer,\ +org.springframework.boot.diagnostics.FailureAnalyzersTests$BrokenAnalysisFailureAnalyzer,\ org.springframework.boot.diagnostics.FailureAnalyzersTests$BasicFailureAnalyzer diff --git a/spring-boot/src/test/resources/failure-analyzers-tests/broken-initialization.factories b/spring-boot/src/test/resources/failure-analyzers-tests/broken-initialization.factories new file mode 100644 index 00000000000..b1dce498466 --- /dev/null +++ b/spring-boot/src/test/resources/failure-analyzers-tests/broken-initialization.factories @@ -0,0 +1,4 @@ +# Failure Analyzers +org.springframework.boot.diagnostics.FailureAnalyzer=\ +org.springframework.boot.diagnostics.FailureAnalyzersTests$BrokenAnalysisFailureAnalyzer,\ +org.springframework.boot.diagnostics.FailureAnalyzersTests$BasicFailureAnalyzer