smali 语法之try catch语句

# virtual methods
.method public onClick(Landroid/view/View;)V
    .locals 4
    .parameter "v"

    .prologue
    .line 62
    :try_start_0
    const-string v3, "try 1"

    invoke-static {v3}, Ljava/lang/System;->clearProperty(Ljava/lang/String;)Ljava/lang/String;
    :try_end_0
    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_2

    .line 64
    :try_start_1
    const-string v3, "try 2"

    invoke-static {v3}, Ljava/lang/System;->clearProperty(Ljava/lang/String;)Ljava/lang/String;
    :try_end_1
    .catch Ljava/lang/Exception; {:try_start_1 .. :try_end_1} :catch_1

    .line 66
    :try_start_2
    const-string v3, "try 3"

    invoke-static {v3}, Ljava/lang/System;->clearProperty(Ljava/lang/String;)Ljava/lang/String;

    .line 67
    const-string v3, "continue3"

    invoke-static {v3}, Ljava/lang/System;->clearProperty(Ljava/lang/String;)Ljava/lang/String;
    :try_end_2
    .catch Ljava/lang/Exception; {:try_start_2 .. :try_end_2} :catch_0

    .line 71
    :goto_0
    :try_start_3
    const-string v3, "continue2"

    invoke-static {v3}, Ljava/lang/System;->clearProperty(Ljava/lang/String;)Ljava/lang/String;
    :try_end_3
    .catch Ljava/lang/Exception; {:try_start_3 .. :try_end_3} :catch_1

    .line 75
    :goto_1
    :try_start_4
    const-string v3, "continue1"

    invoke-static {v3}, Ljava/lang/System;->clearProperty(Ljava/lang/String;)Ljava/lang/String;
    :try_end_4
    .catch Ljava/lang/Exception; {:try_start_4 .. :try_end_4} :catch_2

    .line 79
    :goto_2
    return-void

    .line 68
    :catch_0
    move-exception v2

    .line 69
    .local v2, e3:Ljava/lang/Exception;
    :try_start_5
    const-string v3, "e3"

    invoke-static {v3}, Ljava/lang/System;->clearProperty(Ljava/lang/String;)Ljava/lang/String;
    :try_end_5
    .catch Ljava/lang/Exception; {:try_start_5 .. :try_end_5} :catch_1

    goto :goto_0

    .line 72
    .end local v2           #e3:Ljava/lang/Exception;
    :catch_1
    move-exception v1

    .line 73
    .local v1, e2:Ljava/lang/Exception;
    :try_start_6
    const-string v3, "e2"

    invoke-static {v3}, Ljava/lang/System;->clearProperty(Ljava/lang/String;)Ljava/lang/String;
    :try_end_6
    .catch Ljava/lang/Exception; {:try_start_6 .. :try_end_6} :catch_2

    goto :goto_1

    .line 76
    .end local v1           #e2:Ljava/lang/Exception;
    :catch_2
    move-exception v0

    .line 77
    .local v0, e1:Ljava/lang/Exception;
    const-string v3, "e1"

    invoke-static {v3}, Ljava/lang/System;->clearProperty(Ljava/lang/String;)Ljava/lang/String;

    goto :goto_2
.end method
        顺序分析:
            try {                                    //try0
                System.clearProperty("try 1");
            } catch                                 //catch_2
            
            try {                                    //try1
                System.clearProperty("try 1");
            } catch                                 //catch_1
            
            
            try {                                    //try2
                System.clearProperty("try 3");
                System.clearProperty("continue3");
            } catch                                 //catch_0

            //:goto 0
            try {                                    //try3
                System.clearProperty("continue2");
            } catch                                 //catch_1
                
            //:goto 1
            try {                                    //try4
                System.clearProperty("continue1");
            } catch                                 //catch_2
            
            //:goto_2
            return-void                                //唯一出口,void类型
            
            //:catch_0
            Exception e3 {                
                System.clearProperty("e3");
            }
            //goto :goto_0
            
            //:catch_1
            Exception e2 {                    
                System.clearProperty("e2");
            }
            //goto :goto_1
            
            //:catch_2
            Exception e1 {                    
                System.clearProperty("e1");            
            }
            //goto :goto_2
            
        变形:
            try {                                    //try1
                System.clearProperty("try 1");
            //:goto 1    
                try{                    
                System.clearProperty("continue1");    //try4
                }
            } catch(Exception e1)                     //catch_2合并
            {                    
                System.clearProperty("e1");            
            }
            //goto :goto_2
            
            
            try {                                    //try0
                System.clearProperty("try 2");
            //:goto 0
                try{                    
                System.clearProperty("continue2");    //try3
                }
            } catch(Exception e2)                     //catch_1合并
            {                    
                System.clearProperty("e2");            
            }
            //goto :goto_1
            
            
            try {                                    //try2
                System.clearProperty("try 3");
                System.clearProperty("continue3");
            } catch(Exception e3) {                    //catch_0
                System.clearProperty("e3");
            }
            //goto :goto_0    
            
            //:goto_2
            return-void                                //唯一出口,void类型
            
        处理goto,合并try
            try {
                System.clearProperty("try 1");
                try {
                    System.clearProperty("try 2");
                    try {
                        System.clearProperty("try 3");
                        System.clearProperty("continue3");
                    } catch (Exception e3) {
                        System.clearProperty("e3");
                    }
                    System.clearProperty("continue2");
                } catch (Exception e) {
                    System.clearProperty("e2");
                }
                System.clearProperty("continue1");
            } catch (Exception e) {
                System.clearProperty("e1");
            }
            
            
        goto小技巧:先处理小的,比如:goto0----goto1---goto2---......
原文地址:https://www.cnblogs.com/shuoshuo/p/3443879.html