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)
  • 相关阅读:
    Linux Bash常用命令记录
    Ubuntu 环境 openMVG+openMVS 配置
    GDB调试系列之了解GDB
    OpenCV4系列之图像梯度
    ffmpeg基本功能使用
    GDB调试系列之基础入门
    STL std::pair基本用法
    判断机器CPU的大小端模式并将数据转换成小端形式
    由对象集合创建各种映射_流
    静态类型与函数重载
  • 原文地址:https://www.cnblogs.com/linbc/p/4675837.html
Copyright © 2011-2022 走看看