【本·伍德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 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...
随机推荐
- HDU3549 Flow Problem 【最大流量】
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- Entity Framework笔记(一)
最近在看MVC方面的资料,看了几个教程都在使用Entity Framework做数据持久化.之前也听说过这个东西,在微软的网站上看过一个演示视频,但都没怎么去仔细研究.MVC的东西太庞大了,先慢慢熟悉 ...
- unix您不能使用crontab设置运营计划
unix您不能使用crontab设置运营计划 在系统中进行crontab例如,设置在下列现象时有发生: 解决方法: 编辑cron文件内容: #EDITOR=vi #export EDITOR ...
- Node.js可以做些什么?
就像 JavaScript 至client天生,Node.js 生于网络.Node.js 我们可以做更多的不是开发一个网络 站这么简单,采用 Node.js.您可以轻松地开发: 具有复杂逻辑的站点 ...
- 集成 Entity Framework
ABP 基础设施层——集成 Entity Framework 本文翻译自ABP的官方教程<EntityFramework Integration>,地址为:http://aspnetboi ...
- asp.net学习之ado.net(连接模式访问)
原文:asp.net学习之ado.net(连接模式访问) ado.net框架支持两种模式的数据访问: 连接模式(Connected)和非连接模式(disconnected).这一节介绍如何使用连 ...
- Eclipse扩展安装插件方式
Eclipse安装插件经常使用的是直接安装的方式,就是将插件中包含的plugins和features文件夹中的内容直接复制到了Eclipse的plugins和features文件夹内,这样很容易导致插 ...
- 使用linux服务logrotate文件tomcat日志文件
使用notepad++编辑本地文件 tomcat: /usr/tomcat/logs/catalina.out { copytruncate daily dateext nocompress miss ...
- 几个更新(Update声明)查询方法
积极 文化: 上的方法,数据库更新Update.的标准格式:Update 表名 set =值 where 条件只是依据数据的来源不同,还是有所差别的: 1.从外部输入这样的比較简单例:update ...
- css+html简单的布局demo
于html介绍css作风.可以改变html块状布局,局更加美观.接下来看一个基础布局的小样例: <html> <head> <meta http-equiv=" ...