[improve][misc] Return failed future in async method instead of throw exception directly #20521
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation
Throws an exception from a async method generally a bad practice, for example in
ProducerBuilderImpl#createAsync
,checkArgument
may throws a runtime exception directly:pulsar/pulsar-client/src/main/java/org/apache/pulsar/client/impl/ProducerBuilderImpl.java
Lines 94 to 97 in 50b9a93
If user call it in a async context, it may cause some unexpected behavior, here is a case:
If
createAsync()
throws an exception from inside, thefuture
will never get completed. This kind of problem is very hard to troubleshooting cause it could haven’t any log.So I wrote a PMD rule to examine the entire Pulsar codebase (current master branch), aiming to identify similar kinds of problems. Here it is:
Note: this rule may not be able to scan all similar code issues.
Modifications
Return a failed future instead of throw exception directly, for the given case above, it's will be change to:
Verifying this change
Does this pull request potentially affect one of the following parts:
If the box was checked, please highlight the changes
Documentation
doc
doc-required
doc-not-needed
doc-complete
Matching PR in forked repository
PR in forked repository: Shawyeok#9