David Mollitor created CURATOR-515:
--------------------------------------

             Summary: Backgrounding CheckError 
                 Key: CURATOR-515
                 URL: https://issues.apache.org/jira/browse/CURATOR-515
             Project: Apache Curator
          Issue Type: Improvement
            Reporter: David Mollitor
            Assignee: Jordan Zimmerman


This code is confusing to me:

 
{code:java|title=Backgrounding.java}
    void checkError(Throwable e, Watching watching) throws Exception
    {
        if ( e != null )
        {
            if ( errorListener != null )
            {
                errorListener.unhandledError("n/a", e);
            }
            else if ( e instanceof Exception )
            {
                throw (Exception)e;
            }
            else
            {
                Throwables.propagate(e);
            }
        }
    }
 {code}
 
 
[https://github.com/apache/curator/blob/master/curator-framework/src/main/java/org/apache/curator/framework/imps/Backgrounding.java#L123-L140]

I *think* the code here is meaning to take a run-time Exception and wrap it in 
a checked Exception. However, that is not actually happening here.

If the {{Throwable}} argument is an {{Exception}}, it is thrown as-is. Fair 
enough. However, if the {{Throwable}} is a {{RuntimeException}} it is also 
thrown here because {{RuntimeException}} is a sub-class of {{Exception}}. It is 
not turned into a checked exception. So, if the {{Throwable}} is not an 
{{Exception}}, the only other sub-class of {{Throwable}} is an {{Error}}. The 
call {{Throwables.propagate(e)}} will will see that it is an {{Error}} and 
simply throw it.

[https://docs.oracle.com/javase/8/docs/api/java/lang/RuntimeException.html]

[https://github.com/google/guava/blob/master/guava/src/com/google/common/base/Throwables.java#L132-L134]

So, really, whatever the {{Throwable}} argument is, it is simply re-thrown. 
This code could be simplified to:
{code:java|title=Backgrounding.java}
    void checkError(Throwable e, Watching watching) throws Exception
    {
        if ( e != null )
        {
            if ( errorListener != null )
            {
                errorListener.unhandledError("n/a", e);
            }
            else if ( e instanceof Exception )
            {
                throw (Exception)e;
            }
            else
            {
                throw (Error)e;
            }
        }
    }
 {code}
Is this the intended behavior our should {{RuntimeException}} and {{Error}} be 
wrapped into a checked {{Error}}?



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to