昨天遇到另外一位独立游戏开发人员,所以多聊了一会,然后…然后就没有看书了。(小若:借口!借口!

今天来聊聊错误处理吧。只是毕竟这仅仅是前面的章节。书上的内容似乎有点一笔带过的味道。

没关系,简单更好~

笨木头花心贡献,哈?花心?不,是用心~

转载请注明,原文地址: http://www.benmutou.com/archives/1728

文章来源:笨木头与游戏开发

1.红色警报——error

我们应该能常常看到相似下面的错误信息:

[LUA-print] LUA ERROR: [string "src/main.lua"]:108: [string "src/main.lua"]:89: attempt to index global ‘a’ (a nil value)

这是在发生错误时给我们的提示,通常,这代表我们的代码不能继续正常运行下去了。

但你有知不知道,我们能够伪造这样的错误。没错。主动调用error函数,就会出现这样的信息。

例如以下代码:

  1. error("你的智商不多了,赶紧歇息,恢复一下吧");

然后,运行,输出例如以下信息:

[LUA-print] LUA ERROR: [string "src/main.lua"]:109: [string "src/main.lua"]:96: 你的智商不多了,赶紧歇息。恢复一下吧

这太厉害了。以后你看谁不爽,就往他代码里塞上这句话吧。比方在项目上线前塞进去~

言归正传,当我们在调用一个函数之前。能够先推断即将传递的參数是否正常,假设不正常,我们就能够选择直接抛出error,方便写代码的过程中发现问题。

比方下面的代码:

  1. local name = io.read();
  2. if name ~= "笨木头" then
  3. error("你是一个非常善良有爱心的人,我非常喜欢你..所以,去死吧!");
  4. end

仅仅要发现输入的内容不是“笨木头”,就狠狠地抛出异常。

2.偷个懒——assert

相似刚刚那种推断错误的代码。似乎有点啰嗦,于是,我们能够用assert取代形如if not then的代码。

比方上面的代码改为:

  1. local name = io.read();
  2. local result = assert(name == "笨木头", "你是一个非常善良有爱心的人,我非常喜欢你..所以,去死吧。");

假设assert的第一个參数为不为false。则返回第一个參数的值;否则,运行error函数,输出错误信息。错误信息的内容为assert的第二个參数。

输出结果和之前是一样的~

3.捕获错误代码——pcall

假设在发生错误时,我们不希望代码停止运行,而是做一些紧急措施。那么。能够使用pcall捕获错误。

例如以下面代码:

  1. function test()
  2. print(a[1]);
  3. end
  4. if pcall(test) then
  5. print("正常,呵呵");
  6. else
  7. print("哎。函数出错了。我正在帮你处理。放心吧,等我睡醒就...不是。等你睡醒就没事了~");
  8. end

函数test运行的时候肯定会报错的,由于并不存在a这个table。

使用pcall调用test函数,假设test不报错。则pcall返回ture,否则,返回false。

利用这个特性,我们就能够捕获异常,做一些紧急处理。

运行代码, 输出结果例如以下:

[LUA-print] 哎。函数出错了,我正在帮你处理。放心吧,等我睡醒就…不是,等你睡醒就没事了~

这紧急处理的方式还挺不错的,呵呵。

(小若:不错你个头啊!

这和没处理有区别吗?)

pcall除了会返回true或者false外。还能返回函数的错误信息,例如以下代码:

  1. function test()
  2. print(a[1]);
  3. end
  4. local status, err = pcall(test);
  5. if status then
  6. print("正常。呵呵");
  7. else
  8. print("哎,函数出错了,我正在帮你处理,放心吧。等我睡醒就...不是,等你睡醒就没事了~");
  9. print(err);
  10. end

pcall的第一个返回值和之前一样,true或者false。

而第二个參数则是test函数抛出的错误信息。运行代码。结果例如以下:

[LUA-print] 哎,函数出错了,我正在帮你处理,放心吧,等我睡醒就…不是,等你睡醒就没事了~
[LUA-print] [string "src/main.lua"]:94: attempt to index global ‘a’ (a nil value)

4.结束

关于错误处理,好像没有什么好玩的东西。所以,就写这么多吧~

版权声明:本文博客原创文章,博客,未经同意,不得转载。

【本·伍德Lua专栏】补充的基础06:简单的错误处理的更多相关文章

  1. 【本·伍德Lua专栏】补充的基础09:使用table.concat将一个大的字符串

    近期2天都没有写新的文章了.主要是近期的内容没有特别有意思的. 之前的协同程序也临时没有感觉到特别适用的地方.今天在看数据结构的部分,也是没多大意思(不代表没用). 但是突然发现了一个有意思的地方,那 ...

  2. 【笨木头Lua专栏】基础补充04:迭代器初探

    今天学习的内容还蛮有意思的,让我兴奋了一下~ 笨木头花心贡献,哈?花心?不,是用心~ 转载请注明,原文地址: http://www.benmutou.com/archives/1714 文章来源:笨木 ...

  3. javaSE基础06

    javaSE基础06 一.匿名对象 没有名字的对象,叫做匿名对象. 1.2匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值的,无法获取属性值(现阶段只能设置和拿到一个属性值.只能调用一次方 ...

  4. javascript基础06

      javascript基础06 splice var del_arr = del.splice(0,2); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返 ...

  5. Lua脚本之语法基础快速入门

    要 1.基本数据类型 2.Lua中的常用语句结构以及函数 3.Lua中的常用语句结构介绍 4.Lua中的库函数 目录[-] 一.基本数据类型 二.Lua中的常用语句结构以及函数 1.Lua中的常用语句 ...

  6. Flask基础(06)-->视图常用逻辑

    Flask基础(06)-->视图常用逻辑 返回json 重定向:url_for 自定义状态码 返回json:在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中 ...

  7. mysql数据库基础的简单操作指南

    最近在学习mysql,本文是做的关于mysql学习的笔记,跟大家分享一下,希望对大家学习mysql知识有所助益.mysql现在几乎已经成了网站建设的主流数据库,很多php网站系统都采用了mysql数据 ...

  8. ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程总结 ASP.NET Core 基础教程总算是有了个简单 ...

  9. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...

随机推荐

  1. UVa 10012 - How Big Is It? 堆球问题 全排列+坐标模拟 数据

    题意:给出几个圆的半径,贴着底下排放在一个长方形里面,求出如何摆放能使长方形底下长度最短. 由于球的个数不会超过8, 所以用全排列一个一个计算底下的长度,然后记录最短就行了. 全排列用next_per ...

  2. Androids含文档erver结束(工具包 Httputils)两

    在同server在...的基础上,本文client还登录界面 Andriod简单http get请求基础上,用户注冊后跳转到下载界面,本文下载界面仅仅有两个View,一个是textView显示注冊后u ...

  3. NSIS:获取硬盘中容量最大的分区盘符

    原文 NSIS:获取硬盘中容量最大的分区盘符 我们在安装一些在线视频软件比如迅雷看看时,会发现他们的安装程序会自动判断当前系统中容量最大的分区,以便在其中创建数据缓冲下载的文件夹,这种功能如果实现呢, ...

  4. JS日期显示格式 yyyy-MM-dd hh:mm:ss

     1.字符串转换为日期        Date.parse()       可以把 Date.toString() 和 Date.toUTCString()返回的字符串转换为日期类型 2.日期对象转换 ...

  5. 如何使用iOS 8 指纹识别,代码、示例

    像想象,iOS 8指纹是非常容易使用的.只是需要能够获得一个接口,弹出屏幕模式框,随着app store在相同的. 直接上的条形码.以下代码是从复制Apple官方文件. 加入LocalAuthenti ...

  6. RabbitMQ (两)工作队列

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37620057 本系列教程主要来自于官网新手教程的翻译,然后自己进行了部分的改动与 ...

  7. ExtJs在disabled和readOnly美学分析

    ExtJs中disabled和readOnly美观度的分析 ExtJs中.假设设置输入框为仅仅读属性,一般第一考虑的都是readonly=true 它的效果和正常输入框一样,可是不同意输入: 然而,它 ...

  8. hdu4864Task(馋)

    主题链接: 啊哈哈.点我 题目: Task Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  9. Nlog 配置总结

    Writes log messages to one or more files. Since NLog 4.3 the ${basedir} isn't needed anymore for rel ...

  10. css+html菜单适应性学习的宽度

    本文就是利用css和html自适应于文本菜单的长度. 后效果图实现,例如下列: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvajkwMzgyOTE4Mg= ...