[ 
https://issues.apache.org/jira/browse/LUCENE-7800?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15980321#comment-15980321
 ] 

Dawid Weiss edited comment on LUCENE-7800 at 4/23/17 8:28 AM:
--------------------------------------------------------------

bq. The MethodHandles called there are known to not throw unexpected Exceptions!

See my example in 
https://issues.apache.org/jira/browse/LUCENE-7796?focusedCommentId=15980320 - 
there's definitely a way to propagate an unchecked exception up the caller 
stack. To me this is surprising and is a low-level hack that really has little 
motivation. We could replace it with a dedicated (unchecked) exception wrapper, 
but just letting a checked exception propagate up the stack seems like the 
wrong way to go.


was (Author: dweiss):
bq. The MethodHandles called there are known to not throw unexpected Exceptions!

See my example in 
https://issues.apache.org/jira/browse/LUCENE-7796?focusedCommentId=15980320 - 
there's definitely a way to propagate an unchecked exception up the caller 
stack. To me this is surprising and is a low-level hack that really has little 
motivation. We could replace it with a dedicated (unchecked) exception wrapper, 
but just letting an unchecked exception propagate up the stack seems like the 
wrong way to go.

> Remove code that potentially rethrows checked exceptions from methods that 
> don't declare them ("sneaky throw" hack)
> -------------------------------------------------------------------------------------------------------------------
>
>                 Key: LUCENE-7800
>                 URL: https://issues.apache.org/jira/browse/LUCENE-7800
>             Project: Lucene - Core
>          Issue Type: Task
>            Reporter: Dawid Weiss
>            Priority: Minor
>             Fix For: 6.x, master (7.0)
>
>         Attachments: LUCENE-7800.patch
>
>
> For a long time I considered the "sneaky" throw hack to be a nice way of 
> coding around some of Java's limitations (especially with invoking methods 
> via reflection or method handles), but with time I started to see how it can 
> be potentially dangerous and is nearly always confusing. If you have a Java 
> method and its signature doesn't indicate the possibility of a checked 
> exception you, as a programmer, simply don't expect it to happen. Never. So, 
> for example, you could write:
> {code}
> try {
>  luceneApi();
> } catch (RuntimeException | Error e) {
>   // Handle unchecked exceptions here.
> }
> {code}
> and consider the code above to be absolutely bullet-proof in terms of 
> handling exceptions. Unfortunately with sneaky throws anywhere in the 
> "luceneApi" this is no longer the case -- you can receive a checked exception 
> that will simply fall through and hit some code frame above.
> So I suggest we remove sneaky throw from the core entirely. It only exists in 
> two places -- private methods inside Snowball programs invoked via method 
> handles (these don't even declare checked exceptions so I assume they can't 
> occur) and AttributeFactory -- here there is a real possibility somebody 
> could declare an attribute class's constructor that does throw an unchecked 
> exception. In that case I think it is more reasonable to wrap it in a 
> RuntimeException than rethrow it as original.
> Alternatively, we can modify the signature of {{createAttributeInstance}} and 
> {{getStaticImplementation}} to declare some kind of checked exception (either 
> a wrapper or even a Throwable), but I see little reason for it and it'd 
> change the API.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to