Lua Errors

Lua 是一个扩展性语言, 通常嵌入在其他程序中使用.
所以当Lua运行错误时, 不建议简单的crash或退出, 最好是能返回错误代码和错误信息.

当lua运行时遇到某些错误会抛出异常, 例如对非数字进行数学运算, 调用不存在的函数, 使用不存在的索引取表的值. 通过metatable可以自定义这些错误.

除了这些常见的错误, 我们还可以在lua程序中使用error函数人为的产生错误.

例如, 当条件满足时, 使用error抛出异常 : 

> f = io.open("/root/test1.lua","w")
> f:write([[ print("enter a number:")
>> n = io.read("*n")
>> if not n then error("invalid number") end
>> print(n)
>> ]])
> f:close()
> dofile("/root/test1.lua")
enter a number:
9
9
> dofile("/root/test1.lua")
enter a number:
abc
/root/test1.lua:3: invalid number
stack traceback:
        [C]: in function 'error'
        /root/test1.lua:3: in main chunk
        [C]: in function 'dofile'
        stdin:1: in main chunk
        [C]: in ?
后面一直报错, 不知道是不是BUG
> dofile("/root/test1.lua")
enter a number:
/root/test1.lua:3: invalid number
stack traceback:
        [C]: in function 'error'
        /root/test1.lua:3: in main chunk
        [C]: in function 'dofile'
        stdin:1: in main chunk
        [C]: in ?

使用assert也能达到同样的效果, 评估第一个参数(io.read("*n"))的返回值, 如果是false 则抛出异常, 并且输出第二个参数作为错误消息. 

io.read("*n") , 如果输入不是数字, 返回nil.

> n = assert(io.read("*n"), "invalid number")
99
> print(n)
99
> n = assert(io.read("*n"), "invalid number")
abc
stdin:1: invalid number
stack traceback:
        [C]: in function 'assert'
        stdin:1: in main chunk
        [C]: in ?
> print(n)
99
> n = assert(io.read("*n"), "invalid number")
stdin:1: invalid number
stack traceback:
        [C]: in function 'assert'
        stdin:1: in main chunk
        [C]: in ?
> n = io.read("*l")
ab he
> print(n)
ab he
> n = io.read("*n")
ab12c2d
> print(n)
nil
> n = io.read("*n")
123 3
> print(n)
123

数字判断的例子还可以这么写, 使用 assert 来判断tonumber(n)是否返回nil, 返回nil报错.

n = io.read()
assert(tonumber(n), "invalid input:" .. n .. " is not a number")

注意assert在执行前, 先执行参数中所有的表达式, 所以不管n是否为数字, 都会执行这个字符串连接."invalid input:" .. n .. " is not a number"

文件操作的用法 : 

file = assert(io.open(filename, $fmt))

一般用r模式打开文件来判断文件是否存在.

[参考]

1. 

error (message [, level])

Terminates the last protected function called and returns message as the error message. Function error never returns.

Usually, error adds some information about the error position at the beginning of the message, if the message is a string. The level argument specifies how to get the error position. With level 1 (the default), the error position is where the error function was called. Level 2 points the error to where the function that called error was called; and so on. Passing a level 0 avoids the addition of error position information to the message.

2. 

assert (v [, message])

Issues an error when the value of its argument v is false (i.e., nil or false); otherwise, returns all its arguments. message is an error message; when absent, it defaults to "assertion failed!"

3. 

io.read (···)

Equivalent to io.input():read(···).

  • "*n": reads a number; this is the only format that returns a number instead of a string.
  • "*a": reads the whole file, starting at the current position. On end of file, it returns the empty string.
  • "*l": reads the next line skipping the end of line, returning nil on end of file. This is the default format.
  • "*L": reads the next line keeping the end of line (if present), returning nil on end of file.
  • numberreads a string with up to this number of bytes, returning nil on end of file. If number is zero, it reads nothing and returns an empty string, or nil on end of file.
时间: 2024-10-02 23:51:27

Lua Errors的相关文章

Lua precompiled code

使用luac或者string.dump函数可以将Lua脚本编译成二进制格式, 编译后的代码同样可以使用lua运行. 预编译代码(二进制格式)加载速度比文本快, 但是文件可能更大, 同时二进制格式可以对代码起到一定的保护作用, 因为文本很容易暴露或被修改. # vi test.lua local a=1 function f() a=a+1 return a end for i=1,20 do print(f()) end 使用luac把脚本转换成二进制编码 # luac -o ./test.lc

Lua基础(转)

局部定义与代码块: 使用local声明一个局部变量或局部函数,局部对象只在被声明的那个代码块中有效. 代码块:一个控制结构.一个函数体.一个chunk(一个文件或文本串)(Lua把chunk当做函数处理) 这样,可以在chunk内部声明局部函数,该函数仅在chunk内可见,并且词法定界保证了包内其他函数可以调用此函数.    在chunk内部定义多个local function并且相互调用(或定义local递归调用函数)时,最好先声明,再定义. 应该尽可能的使用局部变量(使用关键词local声明

Lua error message and traceback

Lua执行遇到错误时, 如果错误信息输出为字符串类型, 那么还会附加两个内容,  1. 输出来源, 例如文件或标准输入 2. 错误位置, 行号.  例如 :  > function foo(str) >> if type(str) ~= 'string' then >> print("line 1\n") >> error("string expected") >> end >> print(&quo

Lua code compilation

Lua 虽然是脚本解释语言, 在运行前需要预编译, 同时lua还支持代码预加载操作, 预编译操作等.  在lua代码中  1. 使用load可以将文本转换成匿名函数,  2. 使用loadfile可以将外部文件转换成匿名函数. 3. 匿名函数可以赋予给一个变量然后调用, 或者直接使用()调用. > a=1 > load("a=a+1 print(a)") () 2 > f=load("a=a+1 print(a)") > f() 3 load

Redis开发与运维. 3.4 事务与Lua

3.4 事务与Lua 为了保证多条命令组合的原子性,Redis提供了简单的事务功能以及集成Lua脚本来解决这个问题.本节首先简单介绍Redis中事务的使用方法以及它的局限性,之后重点介绍Lua语言的基本使用方法,以及如何将Redis和Lua脚本进行集成,最后给出Redis管理Lua脚本的相关命令. 3.4.1 事务 熟悉关系型数据库的读者应该对事务比较了解,简单地说,事务表示一组动作,要么全部执行,要么全部不执行.例如在社交网站上用户A关注了用户B,那么需要在用户A的关注表中加入用户B,并且在用

Lua 调用 Opencv 的方法

  Lua 调用 Opencv 的方法 最近想用 Lua 调用 Opencv 进行相关像素级操作,如:bitwise_and 或者 bitwise_or,从而完成图像 IoU 的计算. 那么,怎么用 Lua 调用 Opencv 呢? 查了 Torch 的官方文档,发现只有这么几个可以调用的包: 链接: https://github.com/torch/torch7/wiki/Cheatsheet   然后,你点击一个进去,发现有这么一个方法,可以安装对应的 Opencv 包:  然后,你就在终端

windows lua 多线程 线程同步

今天在改一个程序,改成部分逻辑用lua写,这个程序是多线程的.将程序中部分逻辑改成lua之后,各种非法访问内存错误,各种奇奇怪怪的问题,不分时间,不分地点的出现崩溃.从调用堆栈来看,基本都是使用lua造成的.在多线程中使用lua_newthread得到的lus_State仍然有时候程序会崩溃.基本上可以确定为多线程中操作lua 的问题了. 前几天我转载的一篇文章,文章写了关于lua多线程的作法.作法有二 1.每一个线程函数用lua_newthread产生一个新的lua_state 以后对lua操

Lua 笔记--语法

        Lua允许"多重赋值",也就是一下子将多个值赋予多个变量.每个值或每个变量之间以逗号分隔: a, b = 10, 2*x         在多重赋值中,Lua先对等号右边的所有元素求值,然后才执行赋值. x, y = y, x        -->交换x 与y         Lua总是会将等号右边值的个数调整到与左边变量的个数相一致.规则是:若值的个数少于变量的个数,那么多余的变量会被赋为nil :若值的个数更多的话,那么多余的值会被"静悄悄地&quo

Lua判断Table是否为空的方法

这篇文章主要介绍了Lua判断Table是否为空的方法(空的table即{}),如何判断lua中的table是否是空的table呢,本文就试验了多个方法,最后得出比较好的判断方法,需要的朋友可以参考下 判断方法结论: 代码如下: a={} if next(a) ~=nil then dosomething end 最近在项目里面大量使用的lua,其中lua的table是lua中重要的数据结构,可以被用来当做C++中的数组,vector,map来使用. 如何判断lua中的table是否是空的tabl