zoukankan      html  css  js  c++  java
  • lua技巧分享之保护执行

    我们在c#/c++里为了防止调用出现异常的时候程序可以正常的执行,经常使用try{}catch{}的结构,

    那么,语言简单的lua是怎么做到的呢?答案就在pcall

    先简单的介绍一下这个函数:

    --尝试将一个字符串加上整数,肯定是error的
    local status, err = pcall(function () a = 'a'+1 end)
    print(err)
    --> stdin:1: attempt to perform arithmetic on a string value
    
    local status, err = pcall(function () error("my error") end)
    print(err)
    --> stdin:1: my error
    

    用人话来说就是:传不带参数的函数指针他帮你执行,返回两个参数,第一个是执行状态,成功返回true,有错误返回false,并且错误描述

    注意了,这个函数是不带参数的,如果需要传送参数给你需要调用的函数,你只能选择闭包或者说是匿名函数了

    function make_err(c)
        assert(c)
    end
    local status, err = pcall(function () make_err(1) end)
    print(status, err)

    如果我的执行过程中需要看到调用的堆栈怎么办呢?

    答案就在:debug.traceback()

    完整代码如下:

    function a(s)
        return b(s) .. ' a'
    end
    
    function b(s)
        return c(s) .. ' b'
    end
    
    function c(s)
        if  not s then
            print(debug.traceback())
            error('不可以是nile拉')
        end
        return s .. ' c'
    end
    
    --print(debug.traceback())
    
    local status, err = pcall(function () 
        a(nil) 
    end)
  • 相关阅读:
    bzoj 2816: [ZJOI2012]网络 (LCT 建多棵树)
    bzoj 2157: 旅游 (LCT 边权)
    bzoj 3669: [Noi2014]魔法森林 (LCT)
    bzoj 2049: [Sdoi2008]Cave 洞穴勘测 (LCT)
    bzoj 2002 : [Hnoi2010]Bounce 弹飞绵羊 (LCT)
    bzoj 3282: Tree (Link Cut Tree)
    模拟赛1
    Some tricks
    模拟赛简要题解与心得
    Noip 训练指南
  • 原文地址:https://www.cnblogs.com/linbc/p/4675837.html
Copyright © 2011-2022 走看看