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

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

没关系,简单更好~

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

转载请注明,原文地址: 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. HDU 3788 和九度OJ 1006测试数据是不一样的

    ZOJ问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  2. 【日常学习】【欧拉功能】codevs2296 荣誉的解决方案卫队的一个问题

    转载请注明出处 [ametake版权全部]http://blog.csdn.net/ametake欢迎来看看 题目来源:SDOI2008 文章被剽窃非常严重啊 所以以后都带上版权信息 先上题目 题目描 ...

  3. Web 服务器 (IIS) 角色

    原文:Web 服务器 (IIS) 角色 1. 对于默认安装,请在命令行提示符下键入以下命令,然后按 Enter: start /w pkgmgr /iu:IIS-WebServerRole;WAS-W ...

  4. zoj 3537 Cake (凸包确定+间隔dp)

    Cake Time Limit: 1 Second      Memory Limit: 32768 KB You want to hold a party. Here's a polygon-sha ...

  5. Learn Python More

    0, 看了一个python项目开源源码, 才知道现在这点python知识实在是弱爆了.. 尼玛就像学了2500个常用汉字, 然后要去理解"楚辞".. 代码如下, 解释一点一点从网上 ...

  6. js之面向对象----封装篇

    学习了一天的面向对象总结一下,共分为三类 - -! 老规矩 第一部分是概念性知识!!! 面向对象编程,我们可以把他想象成我们在造人.一个对象便是一个人,这个人有胳膊有腿,这便是一个对象的属性或者方法. ...

  7. User、Role、Permission数据库设计ABP

    ABP 初探 之User.Role.Permission数据库设计 (EntityFramework 继承的另一种使用方法) 最近群里(134710707)的朋友都在讨论ABP源码,我把最近学习的内容 ...

  8. .NET缓存框架CacheManager---1、CacheManager的介绍

    在我们开发的很多分布式项目里面(如基于WCF服务.Web API服务方式),由于数据提供涉及到数据库的相关操作,如果客户端的并发数量超过一定的数量,那么数据库的请求处理则以爆发式增长,如果数据库服务器 ...

  9. c#有关udp可靠传输(包传输数据包) 升级

    在c#有关udp可靠传输(包传输数据包)我们讨论,UDP包的发送,可是上一个程序有一个问题.就是数据比較大.一个Message类序列化后都有2048B,而实际的数据量也就只是 50B罢了,这就说明当中 ...

  10. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2 ...