You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Daniel Sun (JIRA)" <ji...@apache.org> on 2017/02/17 17:21:41 UTC

[jira] [Comment Edited] (GROOVY-8085) Exception in "finally" not caught by outer "try"

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

Daniel Sun edited comment on GROOVY-8085 at 2/17/17 5:21 PM:
-------------------------------------------------------------

My test code:
{code}
    public static void main(String[] args) {
        try { 
            try { 
                System.out.println("try!!!");
            } finally { 
                99 / 0 
            }
        } catch (Exception e) { 
            System.out.println("catch!!!"); 
        }
    }
{code}

*There are two exception tables to handle 0/1, one will print "catch!!!" but another will throw the exception:*
{code}
TRYCATCHBLOCK L3 L5 L5 java/lang/Exception
...
TRYCATCHBLOCK L3 L5 L6 null
{code}

The related bytecodes are shown as follows:
{code}
  // access flags 0x1
  public run()Ljava/lang/Object;
    TRYCATCHBLOCK L0 L1 L2 null
    TRYCATCHBLOCK L3 L4 L2 null
    TRYCATCHBLOCK L0 L1 L5 java/lang/Exception            
    TRYCATCHBLOCK L3 L5 L5 java/lang/Exception
    TRYCATCHBLOCK L0 L1 L6 null
    TRYCATCHBLOCK L3 L5 L6 null
    TRYCATCHBLOCK L5 L7 L6 null
    TRYCATCHBLOCK L8 L9 L6 null
    TRYCATCHBLOCK L10 L11 L12 null
    TRYCATCHBLOCK L13 L14 L12 null
    TRYCATCHBLOCK L10 L11 L15 java/lang/Exception      
    TRYCATCHBLOCK L13 L15 L15 java/lang/Exception
    TRYCATCHBLOCK L10 L11 L16 null
    TRYCATCHBLOCK L13 L15 L16 null
    TRYCATCHBLOCK L15 L17 L16 null
    TRYCATCHBLOCK L18 L19 L16 null
   L20
    INVOKESTATIC script1487143002698.$getCallSiteArray ()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
    ASTORE 1
    INVOKESTATIC org/codehaus/groovy/runtime/BytecodeInterface8.isOrigInt ()Z
    IFEQ L0
    GETSTATIC script1487143002698.__$stMC : Z
    IFNE L0
    INVOKESTATIC org/codehaus/groovy/runtime/BytecodeInterface8.disabledStandardMetaClass ()Z
    IFNE L0
    GOTO L10
   L0
    LINENUMBER 4 L0
    ALOAD 1
    LDC 1
    AALOAD
    ALOAD 1
    LDC 2
    AALOAD
    LDC Ljava/lang/System;.class
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.callGetProperty (Ljava/lang/Object;)Ljava/lang/Object;
    LDC "try!!!"
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    ASTORE 2
    NOP
   L1
    LINENUMBER 6 L1
    ALOAD 1
    LDC 3
    AALOAD
    BIPUSH 99
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    ICONST_0
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    POP
    NOP
   L3
    ALOAD 2
    ARETURN
    GOTO L4
   L4
    ALOAD 1
    LDC 4
    AALOAD
    BIPUSH 99
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    ICONST_0
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    POP
    NOP
    GOTO L21
   L2
    ASTORE 3
    ALOAD 1
    LDC 5
    AALOAD
    BIPUSH 99
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    ICONST_0
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    POP
    ALOAD 3
    ATHROW
   L21
    GOTO L22
   L5
    ASTORE 4
   L23
    LINENUMBER 9 L23
    ALOAD 1
    LDC 6
    AALOAD
    ALOAD 1
    LDC 7
    AALOAD
    LDC Ljava/lang/System;.class
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.callGetProperty (Ljava/lang/Object;)Ljava/lang/Object;
    LDC "catch!!!"
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    ASTORE 5
    NOP
   L7
    NOP
   L8
    ALOAD 5
    ARETURN
    NOP
   L9
    GOTO L22
   L22
    NOP
    GOTO L24
   L6
    ASTORE 6
    ALOAD 6
    ATHROW
   L24
    GOTO L25
   L10
    LINENUMBER 4 L10
    ALOAD 1
    LDC 8
    AALOAD
    ALOAD 1
    LDC 9
    AALOAD
    LDC Ljava/lang/System;.class
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.callGetProperty (Ljava/lang/Object;)Ljava/lang/Object;
    LDC "try!!!"
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    ASTORE 7
    NOP
   L11
    LINENUMBER 6 L11
    ALOAD 1
    LDC 10
    AALOAD
    BIPUSH 99
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    ICONST_0
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    POP
    NOP
   L13
    ALOAD 7
    ARETURN
    GOTO L14
   L14
    ALOAD 1
    LDC 11
    AALOAD
    BIPUSH 99
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    ICONST_0
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    POP
    NOP
    GOTO L26
   L12
    ASTORE 8
    ALOAD 1
    LDC 12
    AALOAD
    BIPUSH 99
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    ICONST_0
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    POP
    ALOAD 8
    ATHROW
   L26
    GOTO L27
   L15
    ASTORE 9
   L28
    LINENUMBER 9 L28
    ALOAD 1
    LDC 13
    AALOAD
    ALOAD 1
    LDC 14
    AALOAD
    LDC Ljava/lang/System;.class
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.callGetProperty (Ljava/lang/Object;)Ljava/lang/Object;
    LDC "catch!!!"
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    ASTORE 10
    NOP
   L17
    NOP
   L18
    ALOAD 10
    ARETURN
    NOP
   L19
    GOTO L27
   L27
    NOP
    GOTO L25
   L16
    ASTORE 11
    ALOAD 11
    ATHROW
   L25
    ACONST_NULL
    ARETURN
    LOCALVARIABLE this Lscript1487143002698; L20 L25 0
    LOCALVARIABLE e Ljava/lang/Exception; L23 L9 4
    LOCALVARIABLE e Ljava/lang/Exception; L28 L19 9
    MAXSTACK = 3
    MAXLOCALS = 12

{code}


was (Author: daniel_sun):
My test code:
{code}
    public static void main(String[] args) {
        try { 
            try { 
                System.out.println("try!!!");
            } finally { 
                99 / 0 
            }
        } catch (Exception e) { 
            System.out.println("catch!!!"); 
        }
    }
{code}

The related bytecodes are shown as follows:
{code}
  // access flags 0x1
  public run()Ljava/lang/Object;
    TRYCATCHBLOCK L0 L1 L2 null
    TRYCATCHBLOCK L3 L4 L2 null
    TRYCATCHBLOCK L0 L1 L5 java/lang/Exception            !!! The exception handler does not cover the whole try-finally statement !!!
    TRYCATCHBLOCK L3 L5 L5 java/lang/Exception
    TRYCATCHBLOCK L0 L1 L6 null
    TRYCATCHBLOCK L3 L5 L6 null
    TRYCATCHBLOCK L5 L7 L6 null
    TRYCATCHBLOCK L8 L9 L6 null
    TRYCATCHBLOCK L10 L11 L12 null
    TRYCATCHBLOCK L13 L14 L12 null
    TRYCATCHBLOCK L10 L11 L15 java/lang/Exception      !!! The exception handler does not cover the whole try-finally statement !!!
    TRYCATCHBLOCK L13 L15 L15 java/lang/Exception
    TRYCATCHBLOCK L10 L11 L16 null
    TRYCATCHBLOCK L13 L15 L16 null
    TRYCATCHBLOCK L15 L17 L16 null
    TRYCATCHBLOCK L18 L19 L16 null
   L20
    INVOKESTATIC script1487143002698.$getCallSiteArray ()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
    ASTORE 1
    INVOKESTATIC org/codehaus/groovy/runtime/BytecodeInterface8.isOrigInt ()Z
    IFEQ L0
    GETSTATIC script1487143002698.__$stMC : Z
    IFNE L0
    INVOKESTATIC org/codehaus/groovy/runtime/BytecodeInterface8.disabledStandardMetaClass ()Z
    IFNE L0
    GOTO L10
   L0
    LINENUMBER 4 L0
    ALOAD 1
    LDC 1
    AALOAD
    ALOAD 1
    LDC 2
    AALOAD
    LDC Ljava/lang/System;.class
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.callGetProperty (Ljava/lang/Object;)Ljava/lang/Object;
    LDC "try!!!"
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    ASTORE 2
    NOP
   L1
    LINENUMBER 6 L1
    ALOAD 1
    LDC 3
    AALOAD
    BIPUSH 99
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    ICONST_0
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    POP
    NOP
   L3
    ALOAD 2
    ARETURN
    GOTO L4
   L4
    ALOAD 1
    LDC 4
    AALOAD
    BIPUSH 99
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    ICONST_0
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    POP
    NOP
    GOTO L21
   L2
    ASTORE 3
    ALOAD 1
    LDC 5
    AALOAD
    BIPUSH 99
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    ICONST_0
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    POP
    ALOAD 3
    ATHROW
   L21
    GOTO L22
   L5
    ASTORE 4
   L23
    LINENUMBER 9 L23
    ALOAD 1
    LDC 6
    AALOAD
    ALOAD 1
    LDC 7
    AALOAD
    LDC Ljava/lang/System;.class
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.callGetProperty (Ljava/lang/Object;)Ljava/lang/Object;
    LDC "catch!!!"
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    ASTORE 5
    NOP
   L7
    NOP
   L8
    ALOAD 5
    ARETURN
    NOP
   L9
    GOTO L22
   L22
    NOP
    GOTO L24
   L6
    ASTORE 6
    ALOAD 6
    ATHROW
   L24
    GOTO L25
   L10
    LINENUMBER 4 L10
    ALOAD 1
    LDC 8
    AALOAD
    ALOAD 1
    LDC 9
    AALOAD
    LDC Ljava/lang/System;.class
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.callGetProperty (Ljava/lang/Object;)Ljava/lang/Object;
    LDC "try!!!"
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    ASTORE 7
    NOP
   L11
    LINENUMBER 6 L11
    ALOAD 1
    LDC 10
    AALOAD
    BIPUSH 99
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    ICONST_0
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    POP
    NOP
   L13
    ALOAD 7
    ARETURN
    GOTO L14
   L14
    ALOAD 1
    LDC 11
    AALOAD
    BIPUSH 99
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    ICONST_0
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    POP
    NOP
    GOTO L26
   L12
    ASTORE 8
    ALOAD 1
    LDC 12
    AALOAD
    BIPUSH 99
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    ICONST_0
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    POP
    ALOAD 8
    ATHROW
   L26
    GOTO L27
   L15
    ASTORE 9
   L28
    LINENUMBER 9 L28
    ALOAD 1
    LDC 13
    AALOAD
    ALOAD 1
    LDC 14
    AALOAD
    LDC Ljava/lang/System;.class
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.callGetProperty (Ljava/lang/Object;)Ljava/lang/Object;
    LDC "catch!!!"
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    ASTORE 10
    NOP
   L17
    NOP
   L18
    ALOAD 10
    ARETURN
    NOP
   L19
    GOTO L27
   L27
    NOP
    GOTO L25
   L16
    ASTORE 11
    ALOAD 11
    ATHROW
   L25
    ACONST_NULL
    ARETURN
    LOCALVARIABLE this Lscript1487143002698; L20 L25 0
    LOCALVARIABLE e Ljava/lang/Exception; L23 L9 4
    LOCALVARIABLE e Ljava/lang/Exception; L28 L19 9
    MAXSTACK = 3
    MAXLOCALS = 12

{code}

> Exception in "finally" not caught by outer "try"
> ------------------------------------------------
>
>                 Key: GROOVY-8085
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8085
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 2.4.8
>         Environment: linux
>            Reporter: Craig Silverstein
>
> I would expect the following code to print `caughtt`:
> ```
> groovy -e 'try { try { true; } finally { 1 / 0 } } catch (e) { println "caughtt" }'
> ```
> But instead, it prints:
> ```
> Caught: java.lang.ArithmeticException: Division by zero
> java.lang.ArithmeticException: Division by zero
>         at script_from_command_line.run(script_from_command_line:1)
> ```
> Why is the exception, thrown by the `finally`, not being caught by the outer try/catch?



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