zoukankan      html  css  js  c++  java
  • Lua中的异常处理pcall、xpcall、debug使用实例

    如果需要在Lua中处理错误,必须使用函数pcall(protected call)来包装需要执行的代码。

    pcall接收一个函数和要传递个后者的参数,并执行,执行结果:有错误、无错误;返回值true或者或false, errorinfo

    复制代码代码如下:
       
    if pcall(function_name, ….) then
    -- no error
    else
    -- some error
    end


    简单示例

    复制代码代码如下:

    > =pcall(function(i) print(i) end, 33)
    33
    true
       
    > =pcall(function(i) print(i) error('error..') end, 33)
    33
    false        stdin:1: error..


    这里注意对返回值的逻辑判断

    复制代码代码如下:

    > function f() return false,2 end
    > if f() then print '1' else print '0' end
    0


    pcall以一种"保护模式"来调用第一个参数,因此pcall可以捕获函数执行中的任何错误。

    通常在错误发生时,希望落得更多的调试信息,而不只是发生错误的位置。但pcall返回时,它已经销毁了调用桟的部分内容。Lua提供了xpcall函数,xpcall接收第二个参数——一个错误处理函数,当错误发生时,Lua会在调用桟展看(unwind)前调用错误处理函数,于是就可以在这个函数中使用debug库来获取关于错误的额外信息了。

    debug库提供了两个通用的错误处理函数:

    debug.debug:提供一个Lua提示符,让用户来价差错误的原因
    debug.traceback:根据调用桟来构建一个扩展的错误消息

    复制代码代码如下:

    >=xpcall(function(i) print(i) error('error..') end, function() print(debug.traceback()) end, 33)
    33
    stack traceback:
    stdin:1: in function <stdin:1>
    [C]: in function 'error'
    stdin:1: in function <stdin:1>
    [C]: in function 'xpcall'
    stdin:1: in main chunk
    [C]: in ?
    false        nil
  • 相关阅读:
    关于这个 blog
    P6499 [COCI2016-2017#2] Burza 题解
    CF1172F Nauuo and Bug 题解
    CF1479D Odd Mineral Resource 题解
    CF1442E Black, White and Grey Tree 题解
    CF1442D Sum 题解
    CF1025D Recovering BST 题解
    CF1056E Check Transcription 题解
    CF1025F Disjoint Triangles 题解
    红包算法的PHP实现
  • 原文地址:https://www.cnblogs.com/-colin/p/8306547.html
Copyright © 2011-2022 走看看