【本·伍德Lua专栏】补充的基础06:简单的错误处理
昨天遇到另外一位独立游戏开发人员,所以多聊了一会,然后…然后就没有看书了。(小若:借口!借口!
)
今天来聊聊错误处理吧。只是毕竟这仅仅是前面的章节。书上的内容似乎有点一笔带过的味道。
没关系,简单更好~
笨木头花心贡献,哈?花心?不,是用心~
转载请注明,原文地址: 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函数,就会出现这样的信息。
例如以下代码:
- error("你的智商不多了,赶紧歇息,恢复一下吧");
然后,运行,输出例如以下信息:
[LUA-print] LUA ERROR: [string "src/main.lua"]:109: [string "src/main.lua"]:96: 你的智商不多了,赶紧歇息。恢复一下吧
这太厉害了。以后你看谁不爽,就往他代码里塞上这句话吧。比方在项目上线前塞进去~
言归正传,当我们在调用一个函数之前。能够先推断即将传递的參数是否正常,假设不正常,我们就能够选择直接抛出error,方便写代码的过程中发现问题。
比方下面的代码:
- local name = io.read();
- if name ~= "笨木头" then
- error("你是一个非常善良有爱心的人,我非常喜欢你..所以,去死吧!");
- end
仅仅要发现输入的内容不是“笨木头”,就狠狠地抛出异常。
2.偷个懒——assert
相似刚刚那种推断错误的代码。似乎有点啰嗦,于是,我们能够用assert取代形如if not then的代码。
比方上面的代码改为:
- local name = io.read();
- local result = assert(name == "笨木头", "你是一个非常善良有爱心的人,我非常喜欢你..所以,去死吧。");
假设assert的第一个參数为不为false。则返回第一个參数的值;否则,运行error函数,输出错误信息。错误信息的内容为assert的第二个參数。
输出结果和之前是一样的~
3.捕获错误代码——pcall
假设在发生错误时,我们不希望代码停止运行,而是做一些紧急措施。那么。能够使用pcall捕获错误。
例如以下面代码:
- function test()
- print(a[1]);
- end
- if pcall(test) then
- print("正常,呵呵");
- else
- print("哎。函数出错了。我正在帮你处理。放心吧,等我睡醒就...不是。等你睡醒就没事了~");
- end
函数test运行的时候肯定会报错的,由于并不存在a这个table。
使用pcall调用test函数,假设test不报错。则pcall返回ture,否则,返回false。
利用这个特性,我们就能够捕获异常,做一些紧急处理。
运行代码, 输出结果例如以下:
[LUA-print] 哎。函数出错了,我正在帮你处理。放心吧,等我睡醒就…不是,等你睡醒就没事了~
这紧急处理的方式还挺不错的,呵呵。
(小若:不错你个头啊!
这和没处理有区别吗?)
pcall除了会返回true或者false外。还能返回函数的错误信息,例如以下代码:
- function test()
- print(a[1]);
- end
- local status, err = pcall(test);
- if status then
- print("正常。呵呵");
- else
- print("哎,函数出错了,我正在帮你处理,放心吧。等我睡醒就...不是,等你睡醒就没事了~");
- print(err);
- 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:简单的错误处理的更多相关文章
- 【本·伍德Lua专栏】补充的基础09:使用table.concat将一个大的字符串
近期2天都没有写新的文章了.主要是近期的内容没有特别有意思的. 之前的协同程序也临时没有感觉到特别适用的地方.今天在看数据结构的部分,也是没多大意思(不代表没用). 但是突然发现了一个有意思的地方,那 ...
- 【笨木头Lua专栏】基础补充04:迭代器初探
今天学习的内容还蛮有意思的,让我兴奋了一下~ 笨木头花心贡献,哈?花心?不,是用心~ 转载请注明,原文地址: http://www.benmutou.com/archives/1714 文章来源:笨木 ...
- javaSE基础06
javaSE基础06 一.匿名对象 没有名字的对象,叫做匿名对象. 1.2匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值的,无法获取属性值(现阶段只能设置和拿到一个属性值.只能调用一次方 ...
- javascript基础06
javascript基础06 splice var del_arr = del.splice(0,2); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返 ...
- Lua脚本之语法基础快速入门
要 1.基本数据类型 2.Lua中的常用语句结构以及函数 3.Lua中的常用语句结构介绍 4.Lua中的库函数 目录[-] 一.基本数据类型 二.Lua中的常用语句结构以及函数 1.Lua中的常用语句 ...
- Flask基础(06)-->视图常用逻辑
Flask基础(06)-->视图常用逻辑 返回json 重定向:url_for 自定义状态码 返回json:在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中 ...
- mysql数据库基础的简单操作指南
最近在学习mysql,本文是做的关于mysql学习的笔记,跟大家分享一下,希望对大家学习mysql知识有所助益.mysql现在几乎已经成了网站建设的主流数据库,很多php网站系统都采用了mysql数据 ...
- ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程总结 ASP.NET Core 基础教程总算是有了个简单 ...
- ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...
随机推荐
- CodeForces 441 A. Valera and Antique Items
纯粹练JAVA.... A. Valera and Antique Items time limit per test 1 second memory limit per test 256 megab ...
- HDU2451:Simple Addition Expression
Problem Description A luxury yacht with 100 passengers on board is sailing on the sea in the twiligh ...
- 如何基于对话框的project基于改变BCG的
一,stdafx.h 增加在下面的例子.BCGCBProInc.h间接介绍lib. #include <BCGCBProInc.h> // BCGControlBar Pro #if ...
- 金蝶K3无法创建数据库,请查看该文件夹的错误的解决方法。
无法创建数据库! 检查你的文件夹C:\XXX\DATA是否存在.并且该系统是不低,或SQL Server服务的启动用户不具备<K3ERP\DBFILE>文件夹的写权限.请改动Windows ...
- 动态传递参数到DevExpress.XtraReports的小结
原文:动态传递参数到DevExpress.XtraReports的小结 前两种方法和WinForm一样,可以传递参数.数组.实体对象.DataTable等1. 采用构造函数具体用法:在Report中p ...
- Oracle 树操作
Oracle 树操作(select…start with…connect by…prior) oracle树查询的最重要的就是select…start with…connect by…prior语法了 ...
- ArcGIS JavaScript API本地部署离线开发环境[转]
原文地址:http://www.cnblogs.com/brawei/archive/2012/12/28/2837660.html 1 获取ArcGIS JavaScript API API的下载地 ...
- C++语言债券系列之十一——友元函数和拷贝构造函数
1.好友功能 (1)友元函数类的普通功能外定义. 定义友元函数和相同的正常功能.在类必须声明的正常功能为好友. (2)友元函数不是一个成员函数. 你不能反对打电话.但直接调用:友元函数访问类的公共.p ...
- awk学习总结(两) How awk works and awk CMD in a file
测试文件names Tom Savage 100 Molly Lee 200 John Doe 300 $0 代表file的整行; $1,第一列;$2,第二列...... $ awk '/Tom/{p ...
- [转载]cookie
cookie概述 在上一节,曾经利用一个不变的框架来存储购物栏数据,而商品显示页面是不断变化的, 尽管这样能达到一个模拟 全局变量的功能,但并不严谨.例如在导航框架页面内右击,单击快捷菜单中的[刷新] ...