当前位置: 首页 > news >正文

Lua错误处理之error、assert、pcall和xpcall

Lua错误处理

  • error
  • assert
  • pcall
  • xpcall

error

error (message [, level])

中止上一次保护函数调用,将错误对象 message 返回。 函数 error 永远不会返回。
当 message 是一个字符串时,通常 error 会把一些有关出错位置的信息附加在消息的前头。 level 参数指明了怎样获得出错位置。 对于 level 1 (默认值),出错位置指 error 函数调用的位置。 Level 2 将出错位置指向调用 error的函数的函数;以此类推。 传入 level 0 可以避免在消息前添加出错位置信息。

在Lua中使用error函数抛出错误信息,通常包含调用堆栈信息以及错误提示信息!
第一个参数message为自定义的错误提示信息。
第二个参数为可选的出错位置信息,默认为1,即为调用error函数的位置;2即为调用error函数的函数的位置;0则不打印出错位置信息!

function testError()
    error("error test1")
    -- error("error test2", 1)
    -- error("error test3", 0)
    -- error("error test4", 2)
end

testError()
--[[
lua: C:\Users\user\Desktop\transition\csdn\test.lua:2: error test1
stack traceback:
    [C]: in function 'error'
    C:\Users\user\Desktop\transition\csdn\test.lua:2: in function 'testError'
    C:\Users\user\Desktop\transition\csdn\test.lua:8: in main chunk
    [C]: ?
]]

assert

assert (v [, message])

如果其参数 v 的值为假(nil 或 false), 它就调用 error; 否则,返回所有的参数。 在错误情况时, message 指那个错误对象; 如果不提供这个参数,参数默认为 “assertion failed!” 。

assert是error的包装,将判断之类的操作包装了进去!所以使用assert比之使用error更为方便!
第一个参数为nil或判断的结果为false的时候抛出错误,中止运行,调用error函数;否则继续执行!
第二个参数为可选的错误提示信息,如果提供这个参数,调用error函数的时候则打印出message;否则使用默认的"assertion failed!"。

function testAssert()
    local a, b = "hello", "world"
    assert(a == b, "a,b is not equal !")
    print("next operate")
end

testAssert()
--[[
lua: C:\Users\user\Desktop\transition\csdn\test.lua:3: a,b is not equal !
stack traceback:
    [C]: in function 'assert'
    C:\Users\user\Desktop\transition\csdn\test.lua:3: in function 'testAssert'
    C:\Users\user\Desktop\transition\csdn\test.lua:7: in main chunk
    [C]: ?
]]

pcall

pcall (f [, arg1, ···])

传入参数,以 保护模式 调用函数 f 。 这意味着 f 中的任何错误不会抛出; 取而代之的是,pcall 会将错误捕获到,并返回一个状态码。 第一个返回值是状态码(一个布尔量), 当没有错误时,其为真。 此时,pcall 同样会在状态码后返回所有调用的结果。 在有错误时,pcall 返回 false 加错误消息。

pcall会捕捉错误,但不会抛出,所以程序的运行不会被中止!
第一个参数为目标函数,如果目标函数执行发生错误,pcall函数返回false和错误信息;否则pcall函数返回true和目标函数所有的调用结果!
后面的参数为目标函数的参数列表,可选!

function testPcall(arg1, arg2)
    print(arg1, arg2)
    error("pcall test")
    -- return "pcall test"
end

local ret, msg = pcall(testPcall, "hello", "fightsyj")
print(ret, msg)

print("next operate")
--[[
hello   fightsyj
false   C:\Users\user\Desktop\transition\csdn\test.lua:3: pcall test
next operate
]]

xpcall

xpcall (f, msgh [, arg1, ···])

这个函数和 pcall 类似。 不过它可以额外设置一个消息处理器 msgh。

xpcall在pcall的基础之上还可以加一个错误处理函数!
第一个参数以及后面的参数列表和pcall一样!
第二个参数为错误处理函数,可以在这个函数中做打印堆栈信息等操作!

function testXpcall()
    error("xpcall test")
    -- return "pcall test"
end

-- 错误处理函数
function dealFunc()
    -- print(debug.traceback())
    print("xpcall dealFunc")
end

local ret, msg = xpcall(testXpcall, dealFunc)
print(ret, msg)

print("next operate")
--[[
xpcall dealFunc
false   nil
next operate
]]

参考:
Lua 5.3 参考手册
Lua 学习笔记(八)错误(error)

相关文章:

  • PSP完美显示中文歌曲名的方法
  • Lua之元表和元方法
  • 30分钟搞定BASH脚本编程[zz]
  • Lua之面向对象的实现
  • 不同种类的webservice错误信息
  • Lua中的require与package.loaded
  • 配置文件多个一个符号,导致struts抛出了匪夷所思的错误
  • 签名不对,请检查签名是否与开发平台上填写的一致
  • win终端工具Cmder的配置与使用
  • hibernate的lazy配置引起的问题
  • Lua实战之table.remove
  • 老婆说明书
  • cocos2d-lua:改变子节点优先级reorderChild
  • 几天工作中的三个技巧!
  • cocos2d-lua:动作Actions的使用
  • 《Java编程思想》读书笔记-对象导论
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • codis proxy处理流程
  • es6要点
  • flutter的key在widget list的作用以及必要性
  • git 常用命令
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript 奇技淫巧
  • Spark RDD学习: aggregate函数
  • Vue.js源码(2):初探List Rendering
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 对象管理器(defineProperty)学习笔记
  • 回顾2016
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前嗅ForeSpider中数据浏览界面介绍
  • 如何解决微信端直接跳WAP端
  • 如何实现 font-size 的响应式
  • 入门级的git使用指北
  • 用mpvue开发微信小程序
  • 原生JS动态加载JS、CSS文件及代码脚本
  • Java总结 - String - 这篇请使劲喷我
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 如何用纯 CSS 创作一个货车 loader
  • 正则表达式-基础知识Review
  • # Apache SeaTunnel 究竟是什么?
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #微信小程序(布局、渲染层基础知识)
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)虚拟机的安装与使用,linux系统安装
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (ZT)一个美国文科博士的YardLife
  • (第27天)Oracle 数据泵转换分区表
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)正点原子I.MX6ULL u-boot移植
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET NPOI导出Excel详解
  • .NET 常见的偏门问题